我在ASP.NET MVC 4中有一个项目,最近使用Bootstrap进行了视觉上的改进。
虽然我对它很满意,但有人认为我并不十分满意。
我必须添加
new { @class = "form-control input-sm" }
对我所有的Html.TextBox助手调用。我想知道是否有一种更优雅的方式来执行此操作...可能会覆盖默认的TextBox帮助程序?
非常感谢您对此的任何见解。
答案 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)