繁体   English   中英

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

[英]Re-using a partial view (ascx) across different Controllers and Views

假设我有2个控制器, TopicsControllerPostsController

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

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

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

Post(详细信息)视图仅继承System.Web.Mvc.ViewPage<MessageBoard.Models.Post>

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

更新
我尝试使用<% Html.RenderPartial("New"); %>渲染部分视图<% Html.RenderPartial("New"); %> <% Html.RenderPartial("New"); %>来自我的Topics / Index.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),如何告诉提交按钮将其发布到该URL?

提前致谢,
马尔科

Ciao Marko,

现在的问题是我的局部视图(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 {} )) { %>

如果您以我显示的方式使用,则可以将第一个和第二个参数分别更改为会妨碍您提交的Action和Controller的名称。

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

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

希望这可以帮助!

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

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

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

@Marko

另一种方法是在PostController中具有如下所示的Action:

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

然后,无论您想在哪里创建帖子,都可以简单地调用此操作,该操作将为您的新帖子返回强类型视图。

即使通过网络IMO进行了补充的http呼叫,此解决方案也具有将新Post的初始化代码集中在一个位置的优点。

当用户按下“ New Post”按钮,然后将接收到的标记注入到模式对话框中或在您喜欢的当前页面中时,可以从View的“观点”进行操作的调用。

希望能帮助到你!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM