2016-10-20 165 views
1

我有表單模型,我想使用屬性名稱作爲某些表單字段屬性的值。最好的辦法是什麼? (在這種情況下,我想要id =「PropertyName」)。如何將「Html.SomeHelper」屬性值設置爲等於模型屬性名稱?

// FormViewModel 
[Display(Name = "First name*")] 
[Required(ErrorMessage = "This field is required")] 
public string FirstName { get; set; } 

// Index.cshtml 
<form id="form1" asp-controller="controller" asp-action="Index" method="post"> 
<div class="form-group"> 
    @Html.TextBoxFor(m => m.FirstName, new 
    { 
    @id = "firstName", 
    @placeholder = Html.DisplayNameFor(m => m.FirstName) 
    }) 
    @Html.ValidationMessageFor(m => m.FirstName) 
</div> 
</form> 

tnx!

+0

如在'@ Html.TextBoxFor(M => m.FirstName,新 { @id = Model.FirstName, @placeholder = Html.DisplayNameFor(M => m.FirstName) })'? – Theo

+0

@Theo,是的,就是這樣。 – idukic

回答

1

正如@teo van kot所說,MVC默認是這樣做的。但是,如果您的屬性路徑是類似於model.Submodel.PropertyName,ID屬性將是「Submodel_PropertyName」。如果你只想「屬性名」,然後就可以使用該擴展方法/包裝:在Razor視圖輸出

public static class Extension method 
{ 
    public static IHtmlContent CustomTextBoxFor<TModel, TResult>(this IHtmlHelper<TModel> helper, Expression<Func<TModel, TResult>> expression) 
    { 
     // very simple implementation, can fail if expression is not as expected! 

     var body = expression.Body as MemberExpression; 

     if(body == null) throw new Exception("Expression refers to a method, not a property"); 

     return helper.TextBoxFor(expression, null, new { id = body.Member.Name, placeholder = helper.DisplayNameFor(expression) }); 
    } 
} 

將是這樣的:

@Html.CustomTextBoxFor(x => x.Foo) 
<input id="Foo" name="Foo" type="text" placeholder="Foo" value=""> 

@Html.TextBoxFor(x => x.Foo) 
<input id="Foo" name="Foo" type="text" value=""> 

@Html.CustomTextBoxFor(x => x.AnotherModel.Foo) 
<input id="Foo" name="AnotherModel.Foo" type="text" placeholder="Foo" value=""> 

@Html.TextBoxFor(x => x.AnotherModel.Foo) 
<input id="AnotherModel_Foo" name="AnotherModel.Foo" type="text" value=""> 

問題的第一和第三種方法,所以使用這種方法,如果您對模型中的幾個地方有相同的屬性名稱:

@Html.CustomTextBoxFor(x => x.DeliveryAddress.StreetName) 
@Html.CustomTextBoxFor(x => x.BillingAddress.StreetName) 

兩個輸入標籤將具有相同的ID屬性!

示例是針對MVC6編寫的,MVC5使用不同的HtmlHelper類型。

0

你剛纔不應該逃脫你的placeholder屬性是這樣的:

@Html.TextBoxFor(m => m.FirstName, new 
    { 
    @id = "firstName", 
    placeholder = Html.DisplayNameFor(m => m.FirstName) 
    }) 

也有是在@id = "firstName"不需要強類型的輔助默認添加id屬性與屬性名稱,所以這將是這樣的你案例:

@Html.TextBoxFor(m => m.FirstName, new 
    { 
    placeholder = Html.DisplayNameFor(m => m.FirstName) 
    }) 
0

基於以上COMENT,它看起來像你正在尋找的解決方案是這樣的

@Html.TextBoxFor(m => m.FirstName, 
new { @id = Model.FirstName, 
@placeholder = Html.DisplayNameFor(m => m.FirstName) 
}) 

但我想說那裏肯定有代碼味道......這是一件非常奇怪的事情。