Inr*_*ego 15 asp.net-mvc html-helper mvc-editor-templates
我对当前的DropDownList实现不满意,因为我对选项标签不能做太多(仅支持选中,支持文本和值).我想在我可以设置禁用和其他个人选项的地方.
目前我正在通过javascript改变选项,但我认为这有点像一种hacky方式,我宁愿只是渲染正确的html开始.
我知道我可以创建一个使用select和option标签的模板,并根据需要制作选项 - 但是正常的DropDownList扩展添加了val的东西以及特定的名称和ID,我想在提交表单时是正确的数据绑定:
<select data-val="true" data-val-number="The field SelectedValue must be a number." id="ParentDropDown_SelectedValue" name="ParentDropDown.SelectedValue">
Run Code Online (Sandbox Code Playgroud)
如何将这些属性添加到我自己的模板中?
Dan*_*.G. 28
你是对的,那些属性(特别是name属性)对于模型绑定至关重要.
假设您要创建一个自定义帮助器
public static MvcHtmlString CustomHelperFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression)
Run Code Online (Sandbox Code Playgroud)
首先,您可以使用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));
}
Run Code Online (Sandbox Code Playgroud)
您可以在以下视图中使用它:
@Html.CustomHelperFor(model => model.ParentDropDown.SelectedValue)
Run Code Online (Sandbox Code Playgroud)
它会产生以下html:
<input id="ParentDropDown_SelectedValue" name="ParentDropDown.SelectedValue" type="text" value="4">
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你!
| 归档时间: |
|
| 查看次数: |
7749 次 |
| 最近记录: |