在不同的控制器和视图中重用部分视图(ascx)

时间:2010-10-31 22:08:50

标签: c# asp.net-mvc viewmodel

假设我有2个控制器, TopicsController PostsController

对于每个控制器,我有几个视图(索引和细节)。

主题(索引) 视图继承System.Web.Mvc.ViewPage<IEnumerable<MessageBoard.Models.Topic>>

主题(明细)视图继承System.Web.Mvc.ViewPage<MessageBoard.Models.TopicFormViewModel>
我正在使用TopicFormViewModel,因为我正在与模型一起发送其他数据。

发布(明细)视图只会继承System.Web.Mvc.ViewPage<MessageBoard.Models.Post>

现在,我已经创建了一个局部视图 (CreatePost.ascx) ,这显然是(p)用于创建新帖子。我希望能够在您上面看到的所有视图上重复使用此控件。

更新
我尝试使用我的 Topics / Index.aspx 视图中的<% Html.RenderPartial("New"); %>渲染部分视图,但这会导致异常

  

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

现在的问题是,我的部分视图 (CreatePost.ascx) 接受了System.Web.Mvc.ViewUserControl<MessageBoard.Models.Post>,我不知道如何从我的所有传递上面的观点。

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

提前致谢,
马尔科

3 个答案:

答案 0 :(得分:1)

Ciao Marko,

  

现在的问题是我的偏爱   view(CreatePost.ascx)接受一个   System.Web.Mvc.ViewUserControl   而且我不确定如何通过   以上所有观点。

我不确定我理解“如何从我上面的所有视图中传递”是什么意思,但我相信你不必从你的视图中传递Post的实例。发生的事情是,从您的视图中,您将调用创建Post模型对象的控制器操作,然后将其绑定到CreatePost.ascx部分。

  

我也不确定如何提交   .ascx值到某个URL(即   / Topics / 1 / CreatePost),我该怎么说   提交按钮发布到该URL?

您有两种选择:

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

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

如果您按照我展示的方式使用,您可以将第一个和第二个参数分别更改为动作和控制器的名称,这些名称将会影响您的提交。

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

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

希望这有帮助!

P.S。为了能够重用您的CreatePost.ascx,将它放在共享视图文件夹(主页面所在的位置)中。

答案 1 :(得分:0)

关于重复使用不在同一视图文件夹中的局部视图,请使用以下内容并传入所需的模型,或者您可以为其定义自定义路径。

<% html.RenderPartial("~/Views/<ControllerName>/<PartialViewName>.ascx", <model>);

答案 2 :(得分:0)

@Marko

另一种方法是在PostController中使用如下的Action:

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

然后,无论您想要创建帖子,只需调用此操作即可返回新帖子的强类型视图。

即使您通过网络IMO进行补充http呼叫,此解决方案的优势在于可以将新帖子的初始化代码集中到一个地方。

从“观点”视图中,当用户按下“新帖子”按钮,然后将接收到的标记注入模态对话框或者您喜欢的地方时,可以完成对动作的调用。当前页面。

希望它有所帮助!