【问题标题】:Asp.Net MVC: Server Controls vs Html class to render controls?Asp.Net MVC:服务器控件与 Html 类呈现控件?
【发布时间】:2008-11-07 10:55:16
【问题描述】:

这样渲染控件有什么好处:

<% Html.RenderPartial("MyControl") %> or
<%=Html.TextBox("txtName", Model.Name) %>

通过网络表单样式:

<uc1:MyControl ID=MyControl runat=server />

我知道性能可能是一个原因,因为不需要创建任何对象,但有可能从代码行为中调用它只是为了执行一些基本的渲染逻辑可能非常有用。

如果不鼓励这样做,那么您应该如何处理这种情况:

  • 您需要有条件地使控件可见,并且您不想用呈现逻辑填充 HTML。

  • 您有 &lt;input type="text" value="&lt;%= Model.Name %&gt;" /&gt;,但您需要检查 Model 是否为 null,否则会引发 NullPointerException。

[编辑]我在开始使用 ASP MVC 时问过这个问题,现在我看到了 MVC 方式的优势,就像在 Cristian 回答中一样。

【问题讨论】:

    标签: .net asp.net asp.net-mvc


    【解决方案1】:

    这有几个原因。 “传统” ASP.NET WebForm 控件封装了 MVC 应用程序的 Controller 和 View 方面,这将违反该模式。此外,通过使它们成为扩展方法,您可以获得很好的能力,例如能够将它们与您自己的实现交换并交换它们以进行测试

    Phil Haack(ASP.NET MVC 的项目经理)在接受 Herdering Code 播客的采访时谈到了这一点

    第 24 集:Phil Haack 谈 ASP.NET MVC Beta 版(第 1 部分)

    http://herdingcode.com/?p=75

    第 24 集:Phil Haack 谈 ASP.NET MVC Beta 版(第 2 部分)

    http://herdingcode.com/?p=82

    【讨论】:

      【解决方案2】:

      从长远来看,在视图中进行空检查可能会导致悲伤。我解释 MVC 编程风格的方式是在控制器中准备视图数据,以便视图可以真正干净且不带有检查和条件。

      另一方面,如果需要遵循可能为空的关联,则可以将该代码放在可重用的帮助器中,例如:

      <%= Html.BindTextBox("txtName", Model, "Person.Name") %>
      

      【讨论】:

        【解决方案3】:

        关于你的第二个问题,为什么不这样做:

        无论如何,您都应该检查您的控制器以确保您的模型不为空!

        【讨论】:

        • 当然可以,但有时你的逻辑稍微复杂一些,虽然它只属于视图
        【解决方案4】:

        一些纯粹主义者可能会说,在您的视图中包含代码违反了 MVC 范式。 RenderPartial 为您的用户控件创建一个假 Page 对象 - 确保后者不依赖于 Page 对象。

        【讨论】:

          【解决方案5】:

          我找到了this question @Matt 的答案:

          此代码是否 A) 处理、存储、 检索、执行操作或 分析数据,或 B) 帮助 显示数据?

          如果答案是 A,它属于你的 控制器。如果答案是B,那么 它属于视图。

          如果是 B,它最终会变成一个问题 的风格。如果你有一些相当长的 用于尝试的条件操作 弄清楚你是否展示了一些东西 用户,那么你可以隐藏那些 代码中的条件操作 在属性后面。

          我同意。对我来说,用 aspx 写会更干净:

          <custom:HtmlTextBox ID="txtName" runat="server" />
          

          在代码隐藏中类似:

          if(this.Model != null) 
          {
             this.txtName.Text = Model.Name;
          }
          

          例如在 .aspx 中:

          <% if(this.Model != null) { %>
            <input type="text" name="txtName" value="<%= Model.Name %>" />
          <% } else { %>
            <input type="text" name="txtName" value="" />
          <% } %>
          

          能够从代码隐藏操作控件非常有用,并且不违反 MVC 模式。也许我错过了什么?

          谢谢!

          【讨论】:

          • 首先,让我们在这里比较苹果和苹果。服务器控制典型的抽象出我们打算编写的 HTML。 Helpers 仍然允许我设置任意属性,而不必暴露属性,例如服务器控件。
          • 另外,我绝不会推荐您发布的代码示例。视图中的逻辑越多,就越应该将其推送到控制器中。你的观点应该非常简单。
          猜你喜欢
          • 2015-09-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多