所以我完全接受了ASP.NET的基本版本,可测试性,SoC,HTML控件......这太棒了。然而,对于它来说,我有一个巨大的标记挂起。我知道它来自我对经典ASP的仇恨,我不禁觉得我在I see this时进入了暮光区。
我不知道替代方案是什么(我可以使用服务器控件,数据绑定等......?)
答案 0 :(得分:11)
你可以做一些事情来帮助清理标记,但我同意它可以得到一些标签 - 汤。
ViewData.Model.myProperty
而不是(MyClasst)ViewData["foo"].myProperty
例如,这是我制作RSS-spitter-outer的扩展名:)
public static string RSSRepeater<T>(this HtmlHelper html, IEnumerable<T> rss) where T : IRSSable
{
StringBuilder result = new StringBuilder();
if (rss.Count() > 0)
{
foreach (IRSSable item in rss)
{
result.Append("<item>").Append(item.GetRSSItem().InnerXml).Append("</item>");
}
}
return result.ToString();
}
所以在我的前端,我所拥有的是<%=Html.RSSRepeater(mydata)%>
,这更好。
答案 1 :(得分:7)
1)助手减少HTML噪音
2)部分视图分解更大的页面/重用视图代码
3)尝试不同的渲染引擎,例如Sparkline
4)如果您的观点包含太多if
语句,则为REFACTOR。
答案 2 :(得分:4)
Avoiding tag soup阅读可能会有所帮助。通常,您不能使用服务器控件(有些可能会工作),没有回发或视图状态。我不认为你可以使用数据绑定(再次可能有例外,我不确定ASP.NET MVC如何处理视图中的服务器控件。) - “数据绑定”的最简单方法是传递列表或数组将数据放入视图中并使用foreach从中构建HTML。
答案 3 :(得分:1)
移动一些(并非全部,仅在有意义的情况下)将逻辑(如日期)显示在模型中。例如,在您的示例中,您可以添加处理.ToShortDateString()调用的Task.DisplayDate字符串属性。然后,如果它发生了变化,你可以在一个地方更改它,它会缩短视图中的代码。
HTML帮助程序很好,有时候。我真的不喜欢在连接的字符串中使用我的HTML或者在某个类中使用StringBuilder,但是如果你做了很多可以处理很多不同数据集的事情,那么它们就不会那么糟糕了。
我还会更改您的C#代码格式首选项以在同一行上包含括号。这减少了混乱。遗憾的是,您无法在代码编辑器和HTML编辑器之间对此进行单独设置,因此您也必须在代码中习惯它。这不是世界上最糟糕的事情。
其他人所说的也有帮助:使用部分观点和强类型。
答案 4 :(得分:1)
我喜欢为我的“&lt; %%&gt;”突出显示语法标签非常类似于背景颜色。我的“&lt; %%&gt;”使用黑色背景和银色(手上没有特定的颜色)颜色标签。这加上其他建议应该使您的代码更具可读性。当然,你总是可以尝试另一种视图引擎(这就是MVC之美!)
答案 5 :(得分:1)
我会看一些其他可用的View引擎,我个人非常喜欢Spark view engine,但还有很多其他引擎。
斯科特·汉塞尔曼(Scott Hanselman)做了一篇很棒的帖子,看了一下spark和Nhaml以及一些标记片段,你可以看看它是否适合你的美学:)
http://www.hanselman.com/blog/TheWeeklySourceCode30SparkAndNHamlCrazyASPNETMVCViewEngines.aspx
答案 6 :(得分:0)
如果在格式化后按ctrl + z,则只撤消格式化而不是键入。
我发现这有助于将第一个括号与if语句保持在同一行
答案 7 :(得分:0)
如果你是在谈论渲染控件中的HTML,我担心它不会变得更好,因为你在MVC中的View中有一个很好的基于标准的包装器。如果没有适应的控件,输出仍然是大约1995年糟糕的嵌套表代码。
谢谢,微软!
答案 8 :(得分:0)
使用服务器端评论<%-- comment --%>
来分隔块并提高可读性。使用额外的行间距来分隔块(由于某种原因,这似乎在于消除我的行间距)。
<%-- Go through each testimonial --%>
<% foreach (var testimonial in ViewData.Model.Testimonials) { %>
<div class="testimonialFrame">
<div class="testimonialHeader"><%= testimonial.summaryText %></div>
<%-- Show video if available --%>
<% if (string.IsNullOrEmpty(testimonial.Video.FullURL) == false) { %>
<div style="padding-top:12px">
<% Html.RenderAction("YouTubeControl", "Application", new { youTubeId = testimonial.Video.FullURL }); %>
</div>
<% } %>
<div class="roundedBox" style="margin-top:15px">
<div id="txtTestimonialText" class="testimonialText paddedBox"><%= testimonial.TestimonialText %></div>
</div>
<div class="testimonialFooter"><%= testimonial.name %></div>
</div>
<% } %>
答案 9 :(得分:0)
非常偶尔使用辅助方法(我不是在讨论扩展辅助方法),使用Html对象模型在视图中编写HTML代码。我不推荐这个,除非你有一些你不能轻易写在视图中的奇怪逻辑。只要.aspx.cs中的代码是VIEW代码就可以了。
在View的.aspx文件中:
<%-- render section --%>
<% RenderTextSection(section); %>
在View的'codebehind'中,您使用HtmlGenericControl创建HTML,然后使用以下行写出来:
htmlControl.RenderControl(new HtmlTextWriter(Response.Output));
我的完整方法:
protected void RenderTextSection(ProductSectionInfo item)
{
HtmlGenericControl sectionTextDiv = new HtmlGenericControl("div");
bool previousHasBulletPoint = false;
System.Web.UI.HtmlControls.HtmlControl currentContainer = sectionTextDiv;
foreach (var txt in item.DescriptionItems)
{
if (!previousHasBulletPoint && txt.bp)
{
// start bulleted section
currentContainer = new HtmlGenericControl("UL");
sectionTextDiv.Controls.Add(currentContainer);
}
else if (previousHasBulletPoint && !txt.bp)
{
// exit bulleted section
currentContainer = sectionTextDiv;
}
if (txt.bp)
{
currentContainer.Controls.Add(new HtmlGenericControl("LI")
{
InnerHtml = txt.t
});
}
else
{
currentContainer.Controls.Add(new HtmlGenericControl()
{
InnerHtml = txt.t
});
}
previousHasBulletPoint = txt.bp;
}
sectionTextDiv.RenderControl(new HtmlTextWriter(Response.Output));
}
答案 10 :(得分:0)
我建议查看MonoRails使用的Velocity模板引擎。 ASP.NET MVC在MonoRails格式上非常接近模型,因此使用Velocity模板非常容易。
答案 11 :(得分:0)
现在你可以尝试Razor(在ASP.NET MVC 3中)
我只是希望“@”也不会吓到你:P