代码之家  ›  专栏  ›  技术社区  ›  Marko

跨不同控制器和视图重新使用部分视图(ascx)

  •  2
  • Marko  · 技术社区  · 13 年前

    假设我有两个控制器, 后控制器 .

    对于每个控制器,我有几个视图

    这个 主题(索引) System.Web.Mvc.ViewPage<IEnumerable<MessageBoard.Models.Topic>>

    这个 主题(细节) 视图继承 System.Web.Mvc.ViewPage<MessageBoard.Models.TopicFormViewModel>
    我使用的是TopicFormViewModel,因为我将随模型一起发送附加数据。

    这个 职位(详细信息) System.Web.Mvc.ViewPage<MessageBoard.Models.Post>

    现在,我创建了一个局部视图 它(显然是:p)用来创建一个新的Post。我希望能够在上面看到的所有视图上重新使用此控件。

    更新
    <% Html.RenderPartial("New"); %> 主题/索引.aspx

    传递到字典中的模型项的类型为“System.Data.Linq.Table`1[MessageBoard.Models.Topic]',但此字典需要“MessageBoard.Models.Post”类型的模型项。

    (CreatePost.ascx) 接受 System.Web.Mvc.ViewUserControl<MessageBoard.Models.Post> 我也不知道如何从上面的所有观点来看。

    我也不确定如何将.ascx值提交到某个URL(即/Topics/1/CreatePost),如何告诉submit按钮将其发送到该URL?

    提前谢谢你,
    马尔科

    3 回复  |  直到 13 年前
        1
  •  1
  •   Lorenzo OnoSendai    13 年前

    再见,马可,

    现在问题是我的部分 视图(CreatePost.ascx)接受 System.Web.Mvc.ViewUserControl 我不知道该怎么把它从 以上是我的观点。

    我不明白你的意思 如何从我上面所有的观点中传递 “但我相信你不必从你的观点中通过一个帖子实例。现在的情况是,从视图中调用一个控制器操作,该操作创建Post模型对象,然后将其绑定到CreatePost.ascx部分。

    .ascx值到某个URL(即。 /Topics/1/CreatePost),我该怎么说

    你有两个选择:

    在CreatePost.ascx部分中,您可能正在使用表单。

    <% using (Html.BeginForm("action", "controller", FormMethod.Post, new {} )) { %>
    

    第二个选项是使用jQuery。只需为表单设置一个ID,然后

    $("#myForm").submit(function(event) {
        //post an ajax request to the server
    });
    

    希望这有帮助!

    P、 为了能够重用CreatePost.ascx部分文件,请将其放在共享视图文件夹(母版页所在的位置)中。

        2
  •  0
  •   Allfocus    13 年前

    要重用不在同一视图文件夹中的局部视图,请使用以下命令并传入所需的模型,或者可以为其定义自定义路由。

    <% html.RenderPartial("~/Views/<ControllerName>/<PartialViewName>.ascx", <model>);
    
        3
  •  0
  •   Lorenzo OnoSendai    13 年前

    @马尔科

    另一种方法是在后控制器中执行如下操作:

    [HttpGet]
    public ActionResult CreatePost( int topicId ) {
        PostModel pm = _manager.CreateDefaultPost();
        pm.TopicID = id;
        return PartialView( "CreatePost", pm );
    }
    

    即使您有一个通过网络IMO的补充http调用,这个解决方案也有一个优势,那就是将新Post的初始化代码集中到一个地方。

    希望有帮助!