2017-05-14 63 views
0

我使用ASP.NET MVC 5.剃刀上的文本字段属性VS密码字段

文本字段(注意htmlAttributes):

@Html.EditorFor(model => model.EmailAddr, 
    new { htmlAttributes = new { @class = "form-control" } }) 

密码字段(通知缺乏htmlAttributes的) :

@Html.PasswordFor(model => model.Passwd, new {@class = "form-control"}) 

这是我能使它工作的唯一方法。

在文本字段上,如果我拿走htmlAttributes它不起作用。

在密码字段上,如果我添加htmlAttributes,它不起作用。

为什么?

+2

你不能在'htmlAttributes'传递给'EditorFor()'之前的MVC 5.1,但你可以写一个自定义模板或使用'TextBoxFor'代替。 –

+1

HTML助手是静态方法的静态类,并且像对静态方法的任何调用一样,您需要给它一个正确的参数;我想如果你不需要它们,你可以添加'null'而不是'new htmlAttributes'。如果你确实需要PasswordFor的html属性,请concider编写自定义HTML助手。 –

回答

2

在我看来,差异在于这些方法的签名。 PasswordFor具有以下特征:

MvcHtmlString Html.PasswordFor(Expression<Func<dynamic,TProperty>> expression, object htmlAttributes)

其中第二个参数是代表htmlAttributes的对象。因此,在这种情况下,您只需使用构造函数语法创建此对象并将其作为参数传递。

然而,EditorFor是不同一点点:

EditorExtensions.EditorFor<TModel, TValue> Method (HtmlHelper<TModel>, Expression<Func<TModel, TValue>>, Object)

其中第二参数是包含additionalViewData的对象。据我所知,htmlAttributes可以是这个对象的一个​​属性。因此,在这种情况下,您正在使用对象初始化程序语法创建对象,其中您设置了值为new { @class = "form-control" }htmlAttributes属性。

1

PasswordFor:

Html.PasswordFor()方法生成具有指定的名称,值和HTML属性的输入密码元素。 签名例如:

public static MvcHtmlString PasswordFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes); 

EditorFor:

该控制是位智能。它根据属性的数据类型呈现HTML标记。您可以传入一个匿名对象,其属性会以某种方式作为某些标记上的属性添加,特别是对于内置编辑器模板。您需要编写自己的自定义编辑器模板,并将所需的值作为附加的viewdata传递。

签名例如:

public static MvcHtmlString EditorFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, object additionalViewData);