在asp.net mvc上为所有html.textbox添加相同的类

时间:2014-04-24 12:53:21

标签: asp.net asp.net-mvc twitter-bootstrap

我在ASP.NET MVC 4中有一个项目,最近使用Bootstrap进行了视觉上的改进。

虽然我对它很满意,但有人认为我并不十分满意。

我必须添加

new { @class = "form-control input-sm" } 

对我所有的Html.TextBox助手调用。我想知道是否有一种更优雅的方式来执行此操作...可能会覆盖默认的TextBox帮助程序?

非常感谢您对此的任何见解。

2 个答案:

答案 0 :(得分:5)

修改

它实际上可行 - 覆盖扩展方法。有关参考,请参阅:How to override an existing extension method

视图在" ASP"中创建。命名空间;所以为了让你的扩展方法覆盖System.Web.Mvc.Html中的默认扩展方法(即静态类InputExtensions),你必须在" ASP"中声明你的覆盖。命名空间。所以在你的MVC项目中定义类InputExtensionOverride.cs就像这样:

using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Web.Mvc;

namespace ASP {
  public static class InputExtensionsOverride {
    public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) {
      return InputExtensionsOverride.TextBoxFor<TModel, TProperty>(htmlHelper, expression, (string)null);
    }

    public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes) {
      return InputExtensionsOverride.TextBoxFor<TModel, TProperty>(htmlHelper, expression, (string)null, htmlAttributes);
    }

    public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes) {
      var dictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
      return InputExtensionsOverride.TextBoxFor<TModel, TProperty>(htmlHelper, expression, (string)null, dictionary);
    }

    public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, string format) {
      return InputExtensionsOverride.TextBoxFor<TModel, TProperty>(htmlHelper, expression, format, ((IDictionary<string, object>)null));
    }

    public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, string format, IDictionary<string, object> htmlAttributes) {
      htmlAttributes = SetCommonAttributes<TModel, TProperty>(htmlHelper, expression, ref htmlAttributes);
      return System.Web.Mvc.Html.InputExtensions.TextBoxFor(htmlHelper, expression, format, htmlAttributes);
    }

    private static IDictionary<string, object> SetCommonAttributes<TModel, TProperty>(HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, ref IDictionary<string, object> htmlAttributes) {
      if (htmlHelper == null) {
        throw new ArgumentNullException("htmlHelper");
      }

      if (expression == null) {
        throw new ArgumentNullException("expression");
      }

      if (htmlAttributes == null) {
        htmlAttributes = new Dictionary<string, object>();
      }

      if (!htmlAttributes.ContainsKey("class")) {
        htmlAttributes.Add("class", "form-control input-sm");
      }

      return htmlAttributes;
    }
  }

}

在您看来,没有任何变化 - 即:

@using (Html.BeginForm()) {
   @Html.TextBoxFor(m => m.SomeProperty)
}

将使用&#34; form-control input-sm&#34;生成文本框。 css class。

答案 1 :(得分:3)

我认为您应该使用jquery为输入字段添加类。

$('input[type=text]').addClass('form-control input-sm');

为textbox添加自定义帮助程序类将没有任何帮助,因为您必须在许多plcaces中再次更改代码。

例如,如果这是您的自定义助手文本框

public static class MyHtmlHelpers
{
    public static MvcHtmlString MyTextBoxFor<TModel, TProperty>(
         this HtmlHelper<TModel> helper, 
         Expression<Func<TModel, TProperty>> expression)
    {
        return helper.TextBoxFor(expression, new { @class = "form-control input-sm" }) 
    }
}

您必须将TextBoxFor转换为此MyTextBoxFor

@Html.MyTextBoxFor(model => model.FirstName)