加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 00:08:18 所属栏目:asp.Net 来源:网络整理
导读:有没有办法在输出上使用扩展方法扩展基本的html助手(TextBoxFor,TextAreaFor等),而不是仅仅重写整个方法?例如,添加… @ Html.TextBoxFor(model = model.Name).Identity(“idName”) 我知道我可以通过以下方式实现这一点,已经…… @ Html.TextBoxFor(model =
有没有办法在输出上使用扩展方法扩展基本的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子类添加属性来为每个扩展方法自定义.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读