おっしゃる通り、これらの属性 (特に name 属性) はモデル バインディングにとって重要です。
次のようなカスタム ヘルパーを作成するとします。
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);
、ネストされたビューを処理して、完全な名前を取得するために使用します。
最後に、 を使用してこれを id 属性に変換できますvar fieldId = TagBuilder.CreateSanitizedId(fullBindingName);
。
したがって、テキスト ボックスを作成する単純なカスタム ヘルパーは次のように記述できます。
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">
それが役に立てば幸い!