2011-01-26 36 views
32

MVC的新手和已經通過asp.net網站上的教程運行。ASP.NET MVC 3自定義HTML幫助程序 - 最佳實踐/使用

它們包括一個自定義html助手截斷表中顯示的長文本的示例。

想知道有什麼其他解決方案的人使用HTML助手,以及在創建/使用它們時是否有任何最佳實踐或要避免的事情。

舉個例子,我正在考慮寫一個自定義的助手,我需要在不同的地方顯示格式的日期,但現在很擔心,有可能是一個更好的解決方案(IE DataAnnotations我的模型)

有什麼想法嗎?

編輯:

另一個潛在用途我只是想字符串連接的...。 自定義助手可以接受用戶ID作爲輸入並返回用戶全名... 結果可能是(Title)(First)(Middle)(Last)的某種形式,具體取決於哪些字段可用。只是一個想法,我還沒有嘗試過這樣的事情。

+0

我仍然對使用自定義HTML助手看到其他任何有趣的事情感興趣。隨意張貼! – stephen776 2011-01-26 14:38:32

回答

16

井格式化DisplayFormat屬性可能是一個很好的解決方案的情況下:

[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}")] 
public DateTime Date { get; set; } 

,然後簡單地說:

@Html.DisplayFor(x => x.Date) 

至於截取字符串有關的自定義HTML助手是一個好的解決方案


UPDATE:

關於你的編輯,自定義HTML幫助可能會在這種情況下工作,但也有另一種方法,我很喜歡:視圖模型。所以,如果在這期特別,你總是會顯示名稱的串聯,那麼你可以定義一個視圖模型:

public class PersonViewModel 
{ 
    public string FullName { get; set; } 
} 

現在控制器是要查詢資料庫,以獲取模型,然後映射這個模型到視圖模型將被傳遞到視圖,以便視圖可以簡單地@Html.DisplayFor(x => x.FullName)。模型和視圖模型之間的映射可以通過框架如AutoMapper來簡化。

+4

很有意思。幾乎看起來像一個自定義的HTML幫手是最後的手段。 – stephen776 2011-01-26 14:16:05

100

我總是使用HtmlHelpers,最常見的是封裝樣板HTML的代,以防我改變主意。我有這樣的幫手:

  • Html.BodyId():生成一個傳統的身份標記標記爲引用添加自定義CSS視圖。
  • Html.SubmitButton(string):根據我想要如何設置按鈕的樣式,生成一個輸入[type = submit]或按鈕[type = submit]元素。
  • Html.Pager(IPagedList):用於從分頁列表模型生成分頁控件。
  • 等....

HtmlHelpers的一個我最喜歡的用途是幹掉常見的表格標記。通常情況下,我有一個表單行的容器div,一個div用於標籤,一個標籤用於輸入,驗證消息,提示文本等等。最終,這可能最終會成爲很多樣板html標籤。我如何已經處理這方面的例子如下:

public static MvcHtmlString FormLineDropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string labelText = null, string customHelpText = null, object htmlAttributes = null) 
{ 
    return FormLine(
     helper.LabelFor(expression, labelText).ToString() + 
     helper.HelpTextFor(expression, customHelpText), 
     helper.DropDownListFor(expression, selectList, htmlAttributes).ToString() + 
     helper.ValidationMessageFor(expression)); 
} 

public static MvcHtmlString FormLineEditorFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, string templateName = null, string labelText = null, string customHelpText = null, object htmlAttributes = null) 
{ 
    return FormLine(
     helper.LabelFor(expression, labelText).ToString() + 
     helper.HelpTextFor(expression, customHelpText), 
     helper.EditorFor(expression, templateName, htmlAttributes).ToString() + 
     helper.ValidationMessageFor(expression)); 
} 

private static MvcHtmlString FormLine(string labelContent, string fieldContent, object htmlAttributes = null) 
{ 
    var editorLabel = new TagBuilder("div"); 
    editorLabel.AddCssClass("editor-label"); 
    editorLabel.InnerHtml += labelContent; 

    var editorField = new TagBuilder("div"); 
    editorField.AddCssClass("editor-field"); 
    editorField.InnerHtml += fieldContent; 

    var container = new TagBuilder("div"); 
    if (htmlAttributes != null) 
     container.MergeAttributes(new RouteValueDictionary(htmlAttributes)); 
    container.AddCssClass("form-line"); 
    container.InnerHtml += editorLabel; 
    container.InnerHtml += editorField; 

    return MvcHtmlString.Create(container.ToString()); 
} 

public static MvcHtmlString HelpTextFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, string customText = null) 
{ 
    // Can do all sorts of things here -- eg: reflect over attributes and add hints, etc... 
}  

一旦你做到了這一點,不過,你可以輸出表格線是這樣的:

<%: Html.FormLineEditorFor(model => model.Property1) %> 
<%: Html.FormLineEditorFor(model => model.Property2) %> 
<%: Html.FormLineEditorFor(model => model.Property3) %> 

...和BAM,您的所有標籤,輸入,提示和驗證消息都在您的頁面上。同樣,您可以在模型上使用屬性並反思它們以獲得真正的智能和乾燥。當然,如果你無法標準化你的表單設計,這將浪費時間。但是,對於簡單的情況,哪裏可以提供您需要的所有自定義,它可以運行grrrrrrrrreat!

故事的道德 - HtmlHelpers可以讓您免受全球設計變更的影響,在視圖之後破壞手工製作的標記。我喜歡他們。但是你可以放棄,有時候部分視圖比編碼助手更好。 我用來決定助手還是局部視圖的一般經驗法則是:如果HTML塊需要大量的條件邏輯或編碼技巧,我使用助手(把代碼放在代碼應該在的地方)。如果不是,如果我只是輸出普通標記沒有太多的邏輯,我使用部分視圖(把標記應放在標記)。

希望這給你一些想法!

+1

很好!這裏有很多好東西。 – stephen776 2011-01-27 00:44:01