HtmlHelper.xxxxxxFor重载中的HTML 5数据属性 - 对象htmlAttributes / IDictionary <string,object =“”> htmlAttributes </string,>

时间:2012-02-16 02:46:58

标签: asp.net-mvc asp.net-mvc-3 html-helper

@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属性时具有详细视图时,我可以选择不使用这些重载。还有别的吗?

1 个答案:

答案 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);
}