处理ASP.NET MVC“标签汤”

时间:2010-02-12 00:15:57

标签: c# asp.net-mvc visual-studio markup code-formatting

我今天正在开发一个ASP.NET MVC模板,在盯着所有那些荧光黄色%标签足够长时间之后,我基本上认定我已经受够了,所以我精心修改了我的ascx文件来查看像这样:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl"         %>

<%  if (Model == null)
    {                                                                       %>
<%=     ViewData.ModelMetadata.NullDisplayText                              %>
<%  }
    else if (ViewData.TemplateInfo.TemplateDepth > 1)
    {                                                                       %>
<%=     ViewData.ModelMetadata.SimpleDisplayText                            %>
<%  }
    else
    {                                                                       %>
<%      foreach (var prop in ViewData.ModelMetadata.Properties.Where(
            pm => pm.ShowForDisplay && !ViewData.TemplateInfo.Visited(pm)))
        {                                                                   %>
<%          if (prop.HideSurroundingHtml)
            {                                                               %>
<%=             Html.Display(prop.PropertyName)                             %>
<%          }
            else
            {                                                               %>
<%              if (!String.IsNullOrEmpty(prop.GetDisplayName()))
                {                                                           %>
                    <span class="display-label">
<%=                     prop.GetDisplayName()                               %>
                    </span>
<%              }                                                           %>
                <span class="display-field">
<%=                 Html.Display(prop.PropertyName)                         %>
                </span>
<%          }                                                               %>
<%      }                                                                   %>
<%  }                                                                       %>

最后的可读性。唯一的问题是,手动执行此操作需要方式。我需要一种自动化方法。某种代码格式化解决方案。也许是宏或Visual Studio加载项或......?你有什么建议吗?

更新

我现在正计划从我的标记中重构大部分逻辑(参见Mike的答案),但与此同时,我提出了一种更易于管理的方法来格式化具有混合代码的ascx文件。 HTML。代码以这种方式更加分散,但是首先将这样的代码格式化起来要容易得多,而且使用起来也容易得多。

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>

<% 
    if (Model == null)
    {
%>
        <%= ViewData.ModelMetadata.NullDisplayText %>
<%
    }
    else if (ViewData.TemplateInfo.TemplateDepth > 1)
    {
%>
        <%= ViewData.ModelMetadata.SimpleDisplayText %>
<%
    }
    else
    {
%>
<%
        foreach (var prop in ViewData.ModelMetadata.Properties.Where(
            pm => pm.ShowForDisplay && !ViewData.TemplateInfo.Visited(pm)))
        {
            if (prop.HideSurroundingHtml)
            {
%>
                <%= Html.Display(prop.PropertyName) %>
<%
            }
            else
            {
%>
                <div class="display-row">   
<%
                if (!String.IsNullOrEmpty(prop.GetDisplayName()))
                    {
%>
                        <div class="display-label">
                            <%= prop.GetDisplayName() %>
                        </div>
<%
                }
%>
                    <div class="display-field">
                        <%= Html.Display(prop.PropertyName) %>
                    </div>
            </div>
<%
            }
        }
    }
%>

3 个答案:

答案 0 :(得分:16)

我相信你的“标签汤”疼痛实际上是一个不同问题的症状:你感觉到它,因为你的观点中有逻辑。视图应该非常轻量级,几乎没有逻辑。您的逻辑应该在您的控制器中,它可以决定根据逻辑呈现不同的视图。或者你可以将逻辑放入帮手。

请参阅this article by Rob Conery

答案 1 :(得分:3)

使用适当的视图模型(以及可选的火花视图引擎),没有标签汤。

特别是,如果使用模板。

不能说明这个例子(甚至更少 - 要解决它),但对我来说 - 通常都是关于整洁感和正确构造事物的能力。


“我正在寻找代码格式化解决方案。” =&GT;那你必须看看火花。即使它们确实包含逻辑,它也会“标记”您的观点。

你的例子(没有重组任何东西)=&gt;

<var nullText="ViewData.ModelMetadata.NullDisplayText"
     templateDepth="ViewData.TemplateInfo.TemplateDepth"
     simpleDisplayText="ViewData.ModelMetadata.SimpleDisplayText"
     props="ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForDisplay && !ViewData.TemplateInfo.Visited(pm))" 
     m="ViewData.Model"/>
<if condition="m==null">
  ${nullText}
</if>
<elseif condition="templateDepth>1">
  ${simpleDisplayText}
</elseif>
<else>
  <for each="var prop in props">
    <if condition="prop.HideSurroundingHtml">
      ${Html.Display(prop.PropertyName)}
    </if>
    <else>
      <span if="!string.IsNullOrEmpty(prop.GetDisplayName()" class="display-field">
        ${prop.GetDisplayName()}
      </span>
      <span class="display-field">
        ${Html.Display(prop.ProperyName)}
      </span>
    </else>
  </for>
</else>

可能在某处出错,但你明白了。

答案 2 :(得分:0)

对于我们当前的项目,我们通过编写HTML帮助程序来清理所有if-elses:

public static void WriteIf(this HtmlHelper helper, bool condition, string truePart, string falsePart)
{
     helper.ViewContext.HttpContext.Response.Write(condition ? truePart : falsePart);
}

然后在HTML中,你会说:

<% Html.WriteIf(Model.IsTrue(), "TrueText", "FalseText"); %>