ASP.NET MVC:视图中的处理量和数量。何时使用辅助方法?

时间:2009-07-27 17:00:41

标签: asp.net-mvc

我的ASP.NET MVC视图变得“混乱”,因为我经常需要有条件地显示导致长内联C#代码的内容,包括难以阅读的三元运算符语句,如下面(仅限演示目的)和类似结构

<%= Model.SupportsFeature ? Model.HasName ? "This model supports the feature and has a name" : "This model supports the feature and has no name" : "This model doesn't support the feature" %>

<%= Model.SupportsFeature ? Model.HasName ? "This model supports the feature and has a name" : "This model supports the feature and has no name" : "This model doesn't support the feature" %>

现在,我应该在视图中保留这个(仍然与视图相关的)逻辑,或者我应该改为:

1)写一个HtmlHelper GetSupportedText(这个...扩展方法?

2)将扩展方法写入实际的Model类?

我正在尝试保持我的代码简洁并将相关内容保持在一起,但我真的不确定如何构建这个并处理与&lt; %%&gt;混淆的视图。

感谢您对此的意见!

修改: 我也担心从C#helper方法中输出HTML(作为字符串) - 这很难调试一个非常难看的。

3 个答案:

答案 0 :(得分:4)

如果您使用的是ViewModel方法,则可以将此逻辑粘贴到ViewModel中的方法/ getter中。

答案 1 :(得分:3)

如果您喜欢使用String {。}或者字符串连接,则可以使用TagBuilder类来创建HTML字符串。我还使用System.Xml.Linq类来处理非常复杂的HTML。

我遵循的一般规则是:“如果有if,请编写HTML帮助程序。”我不能声称这个声明,但我不记得我在哪里听到它。此规则将导致HTML帮助程序扩展的爆炸性增长,因此我使用命名空间组织扩展。我创建了一个扩展名称空间,该名称空间在我添加到web.config中的视图之间共享,然后我为每个特定视图创建特定于视图的扩展代码文件和名称空间。如果您以合理的方式组织代码,并且不会有大量不必要的帮助程序使HTML对象在不需要的地方混乱,这样可以更容易地找到扩展所在的位置。

以下是一个示例,使用默认应用名称MvcApplication1。

添加到web.config以在所有视图中包含我的共享助手:

<pages>
  <namespaces>
    <add namespace="MvcApplication1.Helpers.Shared"/>
  </namespaces>
</pages>

这是Home / About.aspx的特定于视图的助手的简化设计示例。

namespace MvcApplication1.Helpers.About
{
    public static class AboutViewExtensions
    {
        public static string AboutViewHelper(this HtmlHelper Html)
        {
            var tb = new TagBuilder("b");
            tb.SetInnerText("bold text");
            return tb.ToString(TagRenderMode.Normal);
        }
    }
}

这是使用<%@ Import %>指令引入我的命名空间的About.aspx视图。

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<%@ Import Namespace="MvcApplication1.Helpers.About" %> 

<asp:Content ID="aboutContent" ContentPlaceHolderID="MainContent" runat="server">
    <h2>About</h2>
    <p>
        <%= Html.AboutViewHelper() %>
    </p>
</asp:Content>   

答案 2 :(得分:2)

这将进入Helper类 - 最好作为扩展方法。在那里你也可以应用本地化(如果你需要)。

另一种方法是创建一个新属性(如果这是由Linq生成的,则使用共享类)为您执行此操作(输出条件消息)。这样,您可以将该属性与其他输出(如JSON等)一起使用。

底线 - 做有效的事情。你是正确的从视图中删除条件的东西 - 太难调试。如果你将它扔在模型上,你也可以测试它:)