2016-10-20 8 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.FirstName, новый { @id = Model.FirstName, @placeholder = Html.DisplayNameFor (м => m.FirstName) })'? – Theo

+0

@ Theo, да, просто так. – idukic

ответ

1

Как @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.

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) 
}) 

Но я бы сказал, что там определенно запах кода ... это очень странная вещь.