asp.net-mvc-3 – ASP.NET MVC – 在不重写方法的情况下扩展TextBoxFor

前端之家收集整理的这篇文章主要介绍了asp.net-mvc-3 – ASP.NET MVC – 在不重写方法的情况下扩展TextBoxFor前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_404_0@
有没有办法在输出上使用扩展方法扩展基本的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子类添加属性来为每个扩展方法自定义.

猜你在找的asp.Net相关文章