我不满意当前的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">
希望有帮助!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。