我不满意当前的DropDownList实现,因为我不能真正做很多选项标签(仅选择,支持文本和值).我想让我自己的地方,我可以设置残疾人和其他东西在个人的选择.
目前我正在通过javascript改变选项,但我认为这是一个很好的方法,而我更愿意仅仅渲染正确的HTML来开始.
我知道我可以使用选择和选项标签的模板,并按照我想要的方式进行选择 – 但是正常的DropDownList扩展名会添加填充值和特定的名称和ID,我猜是提交表单时正确的数据绑定:
<select data-val="true" data-val-number="The field SelectedValue must be a number." id="ParentDropDown_SelectedValue" name="ParentDropDown.SelectedValue">
解决方法
你是对的,那些属性(特别是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);以获得全名,照顾嵌套视图.
最后,您可以使用var fieldId = TagBuilder.CreateSanitizedId(fullBindingName);将其转换为id属性.
所以创建一个文本框的简单的自定义助手可以写成:
public static MvcHtmlString CustomHelperFor<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">
希望有帮助!