【问题标题】:Dealing with ASP.NET MVC "tag soup"处理 ASP.NET MVC“标签汤”
【发布时间】:2011-01-15 23:12:25
【问题描述】:

我今天在做一个 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>
<%
            }
        }
    }
%>

【问题讨论】:

  • @Kirk,是代码还是格式?
  • 哦:哦,你有没有在编码器中维护这个!?呵呵呵呵:P

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


【解决方案1】:

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

this article by Rob Conery

【讨论】:

  • 有趣的一点,谢谢。老实说,我使用的示例只是对标准 ASP.NET MVC Object.ascx 模板的轻微修改。我可以为我想要修改的所有模板编写帮助程序,但这不只是颠倒问题(即,将 html 代码放在 C# 文件中,而不是 C# 代码放在 html 文件中)?
  • 另一点:我现在正在对我的模板进行大量试验和错误,并将代码放在 ascx 文件中(而不是 C# 文件),我可以进行更改,保存文件,然后刷新浏览器。如果我每次都必须重新运行该应用程序,那将花费更多时间。也许一旦我找到了我喜欢的解决方案,为了可维护性,我可以编写一个帮助程序,但现在,使用 ascx 文件是我的偏好(只要它的格式符合我在我的问题中提出的方式)。跨度>
  • 不幸的是,许多“官方”示例代码可能不是最佳实践。您通常可以将 HTML 代码放在部分中,并让助手渲染它们。助手可以实现 C# 逻辑,例如,决定要渲染的哪个部分,和/或将适当的模型传递给部分。
  • 再次感谢,我想我正在接受你的思维方式,尤其是结合使用辅助函数和部分函数的想法。
  • 丹,还有一些提示。每次更改代码时,您都不必重新运行您的网站。只需运行您的网站一次,然后打开另一个浏览器选项卡/窗口到该网站并保持打开状态。当您更改代码时,只需构建并刷新浏览器窗口。你不必跑步。其次,在项目选项的网页选项卡上,将开始选项更改为“不打开页面...”当您调试时,只需点击运行并刷新您的页面。第一次运行,然后右键单击 ASP.NET 开发服务器并选择“在 Web 浏览器中显示”。
【解决方案2】:

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

特别是,如果使用模板。

关于这个例子不能说太多(更不用说 - 整理出来),但对我来说 - 通常都是关于整洁感和正确组织事物的能力。


“我正在寻找代码格式化解决方案。” => 那么你必须检查火花。即使它们确实包含逻辑,它也会“html化”您的视图。

你的例子(没有重组任何东西)=>

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

可能在某个地方错了,但你明白了。

【讨论】:

    【解决方案3】:

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

    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"); %>
    

    【讨论】:

    • 这是一个很酷的想法,Matt,但是当你有嵌套或多行 if 语句时,它似乎并没有多大帮助,就像在这个例子中一样。我正在寻找代码格式化解决方案。
    • 是的,同意。希望我有更好的东西给你。
    猜你喜欢
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 2015-10-16
    • 2010-09-16
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    相关资源
    最近更新 更多