我今天正在开发一个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>
<%
}
}
}
%>
答案 0 :(得分:16)
我相信你的“标签汤”疼痛实际上是一个不同问题的症状:你感觉到它,因为你的观点中有逻辑。视图应该非常轻量级,几乎没有逻辑。您的逻辑应该在您的控制器中,它可以决定根据逻辑呈现不同的视图。或者你可以将逻辑放入帮手。
答案 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"); %>