@Html.TextBoxFor(
model => model.SomeProperty,
new { data_url = "http://www.google.com" }
)
呈现为
<input id="SomeProperty" data-url="http://www.google.com">
我有一些类似于此
的自定义扩展程序public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes, bool disabled)
{
var htmlAttrs = new RouteValueDictionary(htmlAttributes);
return TextBoxFor<TModel, TProperty>(htmlHelper, expression, htmlAttrs, disabled);
}
public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes, bool disabled)
{
if (disabled)
{
htmlAttributes["disabled"] = true;
}
return htmlHelper.TextBoxFor(expression, htmlAttributes);
}
使用object htmlAttributes
htmlAttributes
的第一个重载调用第二次重载,其中htmlAttributes
转换为IDictionary<string, object> htmlAttributes
,本地TextBoxFor使用IDictionary<string, object>
调用。这意味着
@Html.TextBoxFor(
model => model.SomeProperty,
new { data_url = "http://www.google.com" }, model.IsSomePropertyDisabled
)
呈现为
<input id="SomeProperty" data_url="http://www.google.com">
请注意 data_url ,而不是 data-url 。
基本上,
public static MvcHtmlString TextBox(this HtmlHelper htmlHelper, string name, object value, object htmlAttributes);
非常聪明,知道 data_whatever 将呈现为数据 - 无论,而
public static MvcHtmlString TextBox(this HtmlHelper htmlHelper, string name, object value, IDictionary<string, object> htmlAttributes);
似乎不适用那种逻辑(或者我们可以说不够聪明)。有没有办法告诉它应用相同的逻辑?
作为一种解决方法,当我需要数据属性并且在应用disable属性时具有详细视图时,我可以选择不使用这些重载。还有别的吗?
答案 0 :(得分:7)
我认为在第一个帮助器中创建htmlAttrs
时需要HtmlHelper.AnonymousObjectToHtmlAttributes Method。链接方法
用指定的连字符( - )替换下划线字符(_) HTML属性。
所以,你的第一个方法看起来应该是
public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes, bool disabled)
{
var htmlAttrs = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
return TextBoxFor<TModel, TProperty>(htmlHelper, expression, htmlAttrs, disabled);
}