因此,我完全購買了ASP.NET,可測試性,SoC,HTML控制等基本功能......真是太棒了。然而,對於這個新手來說,我有一個巨大的掛斷標記。我知道它來自我對經典ASP的仇恨,我不禁感到自己已經進入了黃昏時區I see this。如何在我的ASP.Net MVC標記中克服我對<% %>的恐懼?
我不知道另一種方法是什麼(我可以使用服務器控件,數據綁定等..?)
因此,我完全購買了ASP.NET,可測試性,SoC,HTML控制等基本功能......真是太棒了。然而,對於這個新手來說,我有一個巨大的掛斷標記。我知道它來自我對經典ASP的仇恨,我不禁感到自己已經進入了黃昏時區I see this。如何在我的ASP.Net MVC標記中克服我對<% %>的恐懼?
我不知道另一種方法是什麼(我可以使用服務器控件,數據綁定等..?)
有很多事情可以做,以幫助清理的標記,但我同意它可以得到一點點標籤soupy。
ViewData.Model.myProperty
而非(MyClasst)ViewData["foo"].myProperty
舉例來說,這是我取得了令延期的RSS-spitter-外:)
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)%>
,這是更好。
Html幫助器是一種很好的方式,但它有些情況下,在連接代碼而不是視圖中使用HTML會更糟糕。 – 2008-12-12 17:28:53
我同意某種方式,尤其是當您處於前端開發人員需要能夠輕鬆更改標記的環境中時。 – qui 2008-12-12 17:30:18
這是rss,但:標記是非常嚴格和明確的。 – 2008-12-12 17:48:41
Avoiding tag soup閱讀可能會對您有幫助。通常你不能使用服務器控件(有些可能會工作),沒有回傳或視圖狀態。我不認爲你可以使用數據綁定(可能有例外,我不確定ASP.NET MVC如何處理視圖中的服務器控件) - 「數據綁定」最簡單的方法是傳遞一個列表或數組的數據放入視圖中,並使用foreach從其中構建HTML。
1)助手降低HTML噪聲
2)的局部視圖以破碎較大的頁/重用視圖代碼
3)嘗試不同的渲染引擎,如Sparkline
4)重構如果您的視圖包括太多if
聲明。
移動一些(不是所有的,只在有意義的情況下)顯示邏輯(如你的日期)到你的模型中。例如,在您的示例中,您可以添加處理.ToShortDateString()調用的Task.DisplayDate字符串屬性。然後,如果它發生了變化,則將其全部更改爲一個地方,並縮短視圖中的代碼。
HTML助手很好,有時候。我不太喜歡在串聯字符串中使用我的HTML或者在某個類中使用StringBuilder,但是如果您在處理大量不同的數據集時做了很多工作,那麼它們並不是那麼糟糕。
我也會改變你的C#代碼格式首選項,使括號在同一行。這減少了混亂。不幸的是,你不能在代碼編輯器和HTML編輯器之間爲此設置單獨的設置,所以你必須在代碼中習慣它。這不是世界上最糟糕的事情。
其他人說的也有幫助:使用部分視圖和強類型。
如果在格式化後按ctrl + z,只是撤消格式化而不是打字。
我覺得這有助於保持第一支架在同一行的if語句
如果你談論的是從呈現控件的HTML,恐怕不會得到任何好轉,只是因爲你已經有了一個很好的基於標準的包裝器,可以在你的MVC中查看。如果沒有適應性控制,輸出仍然是大約1995年糟糕的嵌套表格代碼。
謝謝,微軟!
使用服務器端註釋<%-- 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>
<% } %>
非常偶爾使用輔助方法(我不是在談論擴展的輔助方法)在使用HTML對象模型視圖本身編寫HTML代碼。我不會推薦這個,除非你有一些奇怪的邏輯,你不能在視圖中輕鬆書寫。只要.aspx.cs中的代碼是VIEW代碼,那麼它很好。
在您查看的.aspx文件:
<%-- render section --%>
<% RenderTextSection(section); %>
在您看來的「代碼隱藏」您使用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));
}
我建議看一下MonoRails使用的Velocity模板引擎。 ASP.NET MVC在MonoRails格式上非常貼近自己,所以使用Velocity模板非常簡單。
我喜歡爲我的「<%%>」標籤添加語法高亮,與背景顏色非常相似。我爲我的「<%%>」標籤使用了黑色背景和銀色(手頭沒有特定顏色)顏色。在這裏加上其他建議應該讓你的代碼更具可讀性。當然,你總是可以嘗試另一個視圖引擎(這是MVC的美麗!)
我會看看一些其他視圖引擎可用,我個人非常喜歡Spark view engine,但也有許多其他人。
斯科特Hanselman的做了一個偉大的職位尋找與標記的一些片段,您可以看看,看看火花和Nhaml它是否適合你的asthetics :)
http://www.hanselman.com/blog/TheWeeklySourceCode30SparkAndNHamlCrazyASPNETMVCViewEngines.aspx
現在好了,你可以嘗試Razor (在ASP.NET MVC 3)
我只是希望「@」不會嚇到你太:P
圖中的代碼看起來或多或少有組織雖然。 – liggett78 2008-12-12 17:24:43