Как @teo van kot сказал, MVC делает это по умолчанию. Но, если путь к вашей собственности - это что-то вроде model.Submodel.PropertyName, атрибут ID будет «Submodel_PropertyName». Если вы хотите просто «ИмениСвойство», то этот метод расширения/обертка может быть использована:
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.
как в '@ Html.TextBoxFor (м => m.FirstName, новый { @id = Model.FirstName, @placeholder = Html.DisplayNameFor (м => m.FirstName) })'? – Theo
@ Theo, да, просто так. – idukic