これらの属性(特に名前属性)は、モデルのバインディングにとって重要です。
はあなたがフィールド名を取得するためにvar fieldName = ExpressionHelper.GetExpressionText(expression);
を使用することができます
public static MvcHtmlString CustomHelperFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
まずなどのカスタムヘルパーを作成してみたいと思います。
次に、ネストされたビューを処理して、フルネームを取得するためにvar fullBindingName = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(fieldName);
を使用します。
最後に、これをvar fieldId = TagBuilder.CreateSanitizedId(fullBindingName);
を使用してid属性に変換できます。あなたが好きなビューでそれを使用することができます
public static MvcHtmlString CustomHelperFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
{
var fieldName = ExpressionHelper.GetExpressionText(expression);
var fullBindingName = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(fieldName);
var fieldId = TagBuilder.CreateSanitizedId(fullBindingName);
var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
var value = metadata.Model;
TagBuilder tag = new TagBuilder("input");
tag.Attributes.Add("name", fullBindingName);
tag.Attributes.Add("id", fieldId);
tag.Attributes.Add("type", "text");
tag.Attributes.Add("value", value == null ? "" : value.ToString());
var validationAttributes = html.GetUnobtrusiveValidationAttributes(fullBindingName, metadata);
foreach (var key in validationAttributes.Keys)
{
tag.Attributes.Add(key, validationAttributes[key].ToString());
}
return new MvcHtmlString(tag.ToString(TagRenderMode.SelfClosing));
}
:
@Html.CustomHelperFor(model => model.ParentDropDown.SelectedValue)
そして、それは次のHTMLを生成します:
をだから、テキストボックスを作成する単純なカスタムヘルパーのように書くことができ
<input id="ParentDropDown_SelectedValue" name="ParentDropDown.SelectedValue" type="text" value="4">
希望すると助かります!
可能な複製:http://stackoverflow.com/questions/2655035/creating-a-selectlistitem-with-the-disabled-disabled-attribute – ataravati
あなたは正しい、彼は同じ最終結果を望んでいる。私はそれを見つけていなかった。しかし、私はあまりにもハッキリと思われるので、そこの答えが嫌いです。私はDaniel J. G.の答えを、私が行きたいと思ったように試してみるつもりです。 – Inrego