有没有办法在输出上使用扩展方法扩展基本的html助手(TextBoxFor,TextAreaFor等),而不是仅仅重写整个方法?例如,添加…
@ Html.TextBoxFor(model => model.Name).Identity(“idName”)
我知道我可以通过以下方式实现这一点,已经……
@ Html.TextBoxFor(model => model.Name,new {@id =“idName”})
但是,当您必须开始添加大量属性时,管理变得笨拙和令人沮丧.有没有办法在没有为每个细节传递htmlAttributes的情况下为这些内容添加扩展?
解决方法
正如@AaronShockley所说,因为TextBoxFor()返回一个MvcHtmlString,所以开发修改输出的’流体API’样式的唯一选择是对辅助方法返回的MvcHtmlStrings进行操作.这样做的一种略微不同的方式,我认为接近你所追求的是使用’属性构建器’对象,如下所示:
public class MvcInputBuilder { public int Id { get; set; } public string Class { get; set; } }
…并设置这样的扩展方法:
public static MvcHtmlString TextBoxFor<TModel,TProp>( this HtmlHelper<TModel> htmlHelper,Expression<Func<TModel,TProp>> expression,params Action<MvcInputBuilder>[] propertySetters) { MvcInputBuilder builder = new MvcInputBuilder(); foreach (var propertySetter in propertySetters) { propertySetter.Invoke(builder); } var properties = new RouteValueDictionary(builder) .Select(kvp => kvp) .Where(kvp => kvp.Value != null) .ToDictionary(kvp => kvp.Key,kvp => kvp.Value); return htmlHelper.TextBoxFor(expression,properties); }
然后你可以在你的视图中做这样的事情:
@this.Html.TextBoxFor( model => model.Name,p => p.Id = 7,p => p.Class = "my-class")
这为您提供了输入属性的强类型和智能感知,您可以通过向适当的MvcInputBuilder子类添加属性来为每个扩展方法自定义.