在ASP.NET MVC 3中使用逻辑构建子视图的好方法是什么

Yng*_*sen 4 asp.net-mvc user-controls partial-views asp.net-mvc-3

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

您建议使用哪种方法在ASP.NET MVC中实现此类分离?
部分视图似乎是明显的答案,但正如我所看到的,"开箱即用"的部分视图几乎不支持单独的控制器.

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

这篇文章还提到了RenderAction方法:ASP .NET MVC正确的UserControl架构

你觉得这种方法有什么缺点吗?
您是否建议更好,更简单的方法来实现这一目标?

Dan*_*ner 5

进入"发布详细信息"视图.一个复合视图,显示"Post Summary"和"Post Comments".

采取部分方法,你最终得到:

public class PostDetailModel
{
    PostSummaryModel Summary { get;set; }
    PostCommentsModel Comments { get;set; }
}
Run Code Online (Sandbox Code Playgroud)

并查看:

<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>
Run Code Online (Sandbox Code Playgroud)

这意味着PostController.Detail方法将负责构造PostSummaryModel,构造PostCommentsModel并选择用于呈现每个部分的部分.

如果您还有以下型号:

public class PostListModel
{
    ICollection<PostSummaryModel> Posts { get;set; }
}
Run Code Online (Sandbox Code Playgroud)

您将有两个操作负责构建PostSummaryModel并知道要使用哪个部分.如果您的应用程序结构不正确,可能会导致重复的数据访问/模型映射代码.但是,如果将模型构建委托并抽象为可重用模型工厂(可以通过两种操作调用),则可以将此风险降至最低.

另一方面,采用Html.Action方法简化您的模型:

public class PostDetailModel
{
    int PostId { get;set; }
}
Run Code Online (Sandbox Code Playgroud)

并查看:

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

    @Html.Action("Comments", new { Model.PostId }) 
</div>
Run Code Online (Sandbox Code Playgroud)

然后可以将其留下"摘要"和"注释"操作来构建自己的模型并选择视图.

然而,在选择Html.Action方法时会有如此轻微的性能影响,因为ASP.NET MVC必须经历模型绑定,执行动作过滤器,验证等的整个过程,因此您可能不会使用Html.Action在足够长的列表视图中显示项目.但是为了创建一个复合视图,它可以是一个非常干净的方式来拼接六个左右的现有视图.