【问题标题】:Is it bad practice for views to create partial(child) views?视图创建部分(子)视图是不好的做法吗?
【发布时间】:2011-03-03 00:20:36
【问题描述】:

我正在创建一个小视图框架。我并不想严格遵守 MVC,但我绝对不想妨碍 MVC 实践。

无论如何,我的一个问题是:视图创建自己的子视图是否不好?

例如,在伪 C# 代码中:

/*BlogEntryView*/
<h1>my blog entry...</h1>
<div class="Comments">
{# //code
  foreach(var comment in Comments){
    Write(new CommentView(comment));
  }
#}
</div>

对于 MVC 风格来说,这是不好的做法吗?正确的做法是在模型用 CommentViews 填充它的 BlogEntryView 中提供一个“占位符”吗?

(另外,请不要标记 asp.net-mvc,这是类似的,但绝不使用 ASP.Net MVC 技术)

为了比较,与此相反的是,在模型代码中添加带有一些占位符的视图:

/*BlogEntryView*/
<h1>my blog entry...</h1>
<div class="Comments">
{# SomePlaceholder #}
</div>

/*In the model code for BlogEntry*/
//v is a BlogEntryView
foreach(var comment in Comments){
  v.PlaceHolder.Add(new CommentView(comment));
}

【问题讨论】:

    标签: c# model-view-controller


    【解决方案1】:

    ASP.NET MVC 和 Ruby on Rails 都通过使用局部视图促进了我认为您所指的方法。

    使用您的示例通常会生成一个称为部分评论记录的视图。在 ASP.NET MVC C# 中,这将如下所示:-

    <h1>my blog entry...</h1>
    <div class="Comments">
      <% foreach (var comment in Model.Comments) { %>
        <% Html.RenderPartial("Comment", comment); %>
      <% } %>
    </div>
    

    按照当前的 MVC 理念和设计原则,这种分解为视图代码的小“原子”部分在许多圈子中受到积极鼓励。但是,在这种分解和可维护性之间总是需要寻求平衡。

    【讨论】:

    • 我知道拥有视图代码的小原子部分很好,但我不知道从另一个视图(而不是模型代码)生成这些原子部分被认为是可以的
    【解决方案2】:

    没有。这实际上是 ASP.NET MVC 模板功能在 MVC 中的工作方式。但是,ASP.NET MVC 中的一个潜在缺陷是在文件结构中搜索视图时会产生轻微的性能成本。这可以通过明确指定完整视图路径来避免。

    http://vishalswami.blogspot.com/2007/11/design-patterns-in-mvc_30.html 讨论 MVC 架构。 The Gang of Four 还建议 MVC 的最大优势之一是它促进了复合 UI(这就是您所描述的)。

    【讨论】:

      【解决方案3】:

      在传统的 MVC 中,每个控制器和模型都有一个视图,称为“MVC 三元组”。我认为您的视图模板是什么,以便能够嵌入其他模板以实现可重用性(想想部分)。

      通过mustache 实现这一点的一项技术。它使用一个视图模型,加上一个模板。模板可以请求其他部分重用其他模板的块。

      许多 Web MVC 框架的问题在于,它们将视图视为模板,这是错误的查看方式(没有双关语)。一旦你有了一个代表视图的类,这一切就变得容易多了。

      就个人而言,我认为您发布的具体示例格式不正确,因为模板永远不应该具有对对象的那种访问权限并像那样实例化它们。模板应该从外部来源(视图模型)获取数据,这可以使这些实例更清晰。

      【讨论】:

      • 嗯,有趣的不同观点。基本上,我要问的问题是,鉴于所有这些,“纯”MVC 是否更好。
      • 另外,你是说我的第二个代码示例是你更喜欢使用的那个? (我已经编辑了我的问题以包括这两种方法)
      • 是的,imo,第二个代码块是“正确的”。您的视图模板应该只包含标记和基本控制结构。
      【解决方案4】:

      视图创建自己的子视图是否不好?我的回答是“不”。 In face 创建局部视图让您更有能力以模块化方式更改 UI 内容。

      总是有多种方法可以取得成果。我个人认为 ascx 文件是创建可以从自定义用户控件继承的可重用模块的一种很好的干净方式。它的模块化方法使我的事情变得井井有条。

      只要我的 2 美分...

      【讨论】:

        【解决方案5】:

        我了解有支持和反对呈现儿童观点的观点的社区。

        我个人认为使用 RenderPartial 仍然是一个视图问题。我对依赖于另一个视图的视图没有问题,只要它假定控制器操作的模型提供的模型相同。

        另一方面,RenderAction 与视图无关,因为它最终会调用控制器操作,然后再渲染视图。它本身就是一个完整的请求生命周期。但是,它有很多好处,特别是对于横切关注点,例如站点导航、用户帐户状态、广告或其他完全独立于页面主要目标的页面功能。

        【讨论】:

          猜你喜欢
          • 2010-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多