我總是使用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塊需要大量的條件邏輯或編碼技巧,我使用助手(把代碼放在代碼應該在的地方)。如果不是,如果我只是輸出普通標記沒有太多的邏輯,我使用部分視圖(把標記應放在標記)。
希望這給你一些想法!
我仍然對使用自定義HTML助手看到其他任何有趣的事情感興趣。隨意張貼! – stephen776 2011-01-26 14:38:32