【问题标题】:What is a good way to build sub views with logic in ASP.NET MVC 3什么是在 ASP.NET MVC 3 中使用逻辑构建子视图的好方法
【发布时间】:2011-10-05 08:04:13
【问题描述】:

我们正在使用 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 correct UserControl architecture

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

【问题讨论】:

  • 您能否发布 5 个示例来说明您想要实现的目标。适合我的可能不适合你。

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


【解决方案1】:

查看“发布详细信息”视图。显示“帖子摘要”和“帖子评论”的复合视图。

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

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; }
}

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

另一方面,采用 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>

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

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

【讨论】:

  • 这意味着子模型与主模型有联系(可能是“摘要”与主模型无关,此处:PostDetailModel)。
【解决方案2】:

我认为你应该使用 ActionRenderAction,正如 Darin 指出的那样,如果你想在你的视图中加入逻辑。但是,您可以使用一个“hacky”解决方案,即实现您自己的IViewPageActivator。然后你可以让你的视图实现一个自定义的WebViewPage 并在这个WebViewPage 中注入服务,它们将对你的视图可用。总结一下:

  • 如果只需要注入模型,请使用PartialRenderPartial
  • 如果您的局部视图中有一些逻辑,请使用 ActionRenderAction
  • 如果确实需要,请实现 IViewPageActivator 和其他一些东西

更新:此外,在简单的场景中,助手可能会根据您要实现的目标为您完成工作。

【讨论】:

    【解决方案3】:

    查看用于控制复杂 UI 的客户端站点 MVC javascript 框架。 结合 jquery 模板非常强大和一个选项来关注...

    Backbone.js http://documentcloud.github.com/backbone/

    Kockout.js http://knockoutjs.com/

    Knockout.js 与 Backbone.js - 第 1 部分 http://ifandelse.com/?p=61

    Knockout.js 与 Backbone.js - 第 2 部分 http://ifandelse.com/?p=70

    【讨论】:

      【解决方案4】:

      Html.Action and Html.RenderAction 是在需要自己的控制器和模型的视图中外部化一些重复的复杂逻辑的最佳方式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-07
        相关资源
        最近更新 更多