微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

asp.net-mvc – 使用自己的HtmlHelper扩展名用于模型绑定的输入

我不满意当前的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 举报,一经查实,本站将立刻删除。

相关推荐