2011-01-26 65 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