Asp.net-Mvc

ASP.NET MVC 3 自定義 HTML 幫助程序 - 最佳實踐/使用

  • January 26, 2011

剛接觸 MVC,並且一直在執行 asp.net 網站上的教程。

它們包括一個自定義 html 幫助器的範例,用於截斷表格中顯示的長文本。

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

例如,我正在考慮編寫一個自定義幫助器來格式化我需要在各個地方顯示的日期,但現在我擔心可能會有更優雅的解決方案(我的模型中的 IE DataAnnotations)

有什麼想法嗎?

編輯:

我剛剛想到的另一個潛在用途……字元串連接。自定義助手可以將使用者 ID 作為輸入並返回使用者全名……結果可能是某種形式的(標題)(第一)(中間)(最後),具體取決於哪些欄位可用。只是一個想法,我還沒有嘗試過這樣的事情。

那麼在格式化DisplayFormat屬性的情況下可能是一個不錯的解決方案:

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

然後簡單地說:

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

就截斷字元串而言,自定義 HTML 助手是一個很好的解決方案。


更新:

關於您的 EDIT,自定義 HTML 助手可能在這種情況下工作,但還有一種我非常喜歡的替代方法:視圖模型。因此,如果在這個特定視圖中您總是要顯示名稱的串聯,那麼您可以定義一個視圖模型:

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

現在控制器將查詢儲存庫以獲取模型,然後將此模型映射到將傳遞給視圖的視圖模型,以便視圖可以簡單地@Html.DisplayFor(x => x.FullName). 模型和視圖模型之間的映射可以通過AutoMapper等框架來簡化。

我一直使用 HtmlHelpers,最常用的是封裝樣板 HTML 的生成,以防我改變主意。我有這樣的幫手:

  • Html.BodyId():為視圖添加自定義css時生成一個正常的body id標籤供參考。
  • Html.SubmitButton(string): 生成一個 input[type=submit] 或 button[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,您的所有標籤、輸入、提示和驗證消息都在您的頁面上。同樣,您可以在模型上使用屬性並對其進行反思以變得非常聰明和乾燥。當然,如果您不能標準化您的表單設計,這將是浪費時間。但是,對於簡單的情況,css 可以提供您需要的所有自定義,它可以工作 grrrrrrrreat!

故事的寓意——HtmlHelpers 可以使您免受全球設計變化的影響,這些變化會在一個又一個視圖中破壞手工製作的標記。我喜歡他們。但是你可能會過火,有時部分視圖比編碼的助手更好。我用來決定輔助視圖還是部分視圖的一般經驗法則:如果 HTML 塊需要大量條件邏輯或編碼技巧,我會使用輔助函式(將程式碼放在程式碼應該在的位置);如果不是,如果我只是在沒有太多邏輯的情況下輸出通用標記,我會使用部分視圖(將標記放在標記應該在的位置)。

希望這能給你一些想法!

引用自:https://stackoverflow.com/questions/4804833