asp.net-mvc - 什么是在 ASP.NET MVC 3 中使用逻辑构建 subview 的好方法

标签 asp.net-mvc asp.net-mvc-3 user-controls partial-views

我们正在使用 Microsoft ASP.NET MVC 3 构建业务应用程序。
一些 View 现在变得如此复杂,以至于将它们分成两个或多个单独的 View 似乎是合理的,具有单独的 Controller 和模型。 (重用是想要构建单独 View 的另一个原因。)

您推荐哪种方法在 ASP.NET MVC 中实现这种分离?
部分 View 似乎是显而易见的答案,但正如我所见,“开箱即用”的部分 View 几乎不支持单独的 Controller 。

到目前为止,我们发现的最佳解决方案是Html.RenderAction("<view initialization action method>")此处解释的方法:http://www.primaryobjects.com/CMS/Article129.aspx

这篇文章还提到了 RenderAction 方法:ASP .NET MVC correct UserControl architecture

您认为这种方法有什么缺点吗?
您是否推荐任何更好、更简单的方法来实现这一目标?

最佳答案

采取“发布详细信息” View 。显示“帖子摘要”和“帖子评论”的复合 View 。

采用部分方法,您最终会得到:

public class PostDetailModel
{
    PostSummaryModel Summary { get;set; }
    PostCommentsModel Comments { get;set; }
}

并查看:
<div id="post_detail">
    @Html.Partial("Summary", Model.Summary)

    <ul class="comment-list">
    @foreach(var comment in Model.Comments)
    {
        <li>@Html.Partial("Comment", comment)</li>
    }
    </ul>
</div>

这意味着 PostController.Detail 方法将负责构造 PostSummaryModel、构造 PostCommentsModel 并选择使用哪些部分来呈现每个部分。

如果您还拥有以下模型:
public class PostListModel
{
    ICollection<PostSummaryModel> Posts { get;set; }
}

您将有两个 Action 负责构建 PostSummaryModel 并知道要使用哪个部分。如果您的应用程序结构不正确,这可能会导致重复的数据访问/模型映射代码。但是,如果您将模型构造委托(delegate)和抽象到可重用的模型工厂(这两个操作都可以调用),您可以最大限度地减少这种风险。

另一方面,采用 Html.Action 方法,您的模型就变成了:
public class PostDetailModel
{
    int PostId { get;set; }
}

并查看:
<div id="post_detail">
    @Html.Action("Summary", new { Model.PostId })

    @Html.Action("Comments", new { Model.PostId }) 
</div>

然后可以留下“摘要”和“评论”操作来构建自己的模型并选择 View 。

然而,选择 Html.Action 方法对性能的影响很小,因为 ASP.NET MVC 必须经历模型绑定(bind)、执行 Action 过滤器、验证等的整个过程,所以你可能不会使用 Html.Action在足够长的 ListView 中显示项目。但是对于创建复合 View 来说,将六个左右的现有 View 拼接在一起可能是一种非常干净的方法。

关于asp.net-mvc - 什么是在 ASP.NET MVC 3 中使用逻辑构建 subview 的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7658361/

相关文章:

c# - 使用参数构造函数和 Ninject 配置 Automapper 配置文件类

c# - 不修改现有响应的 MVC Controller 操作

c# - 使用 MVC 为 View 中 foreach 循环内的表生成随机 ID

c# - ASP.NET : Possible to create a UserControl that include inside markup content?

ASP.NET 如何通过自定义 UserControl 更改页面控件?

wpf - 设计时失败 : WPF, 用户控件和命名空间

asp.net-mvc - 为什么 DisplayFormat DataFormatString 不起作用?

angularjs - 如何使用angularjs和MVC3以相同的功能从两个不同的html文件上传中保存两个文件

c# - 用于角色管理的 MVC3 复选框列表

asp.net - 以编程方式将多个地址添加到谷歌地图中