2017-05-14 60 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);