2016-10-20 5 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!あなたはちょうどこのようなあなたのplaceholderプロパティを逃れるべきではありません

+0

'? – Theo

+0

@テオ、そうですね。 – idukic

答えて

1

@teo van kotによると、MVCはデフォルトでこれを行います。しかし、プロパティへのパスがmodel.Submodel.PropertyNameのようなものであれば、ID属性は "Submodel_PropertyName"になります。あなただけの「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型を使用しています。 `@ H​​tml.TextBoxFor(M => m.FirstName、新しい {@id = Model.FirstName、 @プレースホルダ= Html.DisplayNameFor(M => m.FirstName) })のよう

0

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

はまた@id = "firstName"強く型付けされたヘルパーでの必要はありませんが、デフォルトではプロパティ名とid属性を追加し、それはあなたにこのようになりますケースは:

上記COMENTに基づき
@Html.TextBoxFor(m => m.FirstName, new 
    { 
    placeholder = Html.DisplayNameFor(m => m.FirstName) 
    }) 
0

、それはあなたが求めているソリューションのように見えるこの

です

しかし、私は確かにそこにコードのにおいがあると言うでしょう...それは非常に奇妙なことです。

関連する問題