如何将匿名对象HTML属性转换为Dictionary <string,object =“”>

时间:2015-05-01 10:22:47

标签: asp.net-mvc html-helper

我正在为RadioButtonFor提供额外的重载,并希望将键值对添加到传入的HTML属性中。

作为一个例子,我传递的内容如下:

new { id = "someID" }

当我使用HtmlHelper.AnonymousObjectToHtmlAttributes方法似乎是我正在寻找的建议时,它产生了一个包含4个项目的字典,其中包含“Comparer”,“Count”,“Keys”,“Values”的键。 。然后我尝试使用Reflection来迭代“键”和“值”中的值,但是也无法使其工作。

基本上我想做的就是能够将htmlAttributes转换为IDictionary,添加一个项目,然后将其传递给常规的RadioButtonFor方法。

编辑: 这是我真正想要做的事情。提供一个名为isDisabled的重载,以便能够设置单选按钮的禁用状态,因为这不能使用HTML属性直接完成,因为disabled = false仍然会禁用被禁用的标记并禁用无线电。

public static MvcHtmlString RadioButtonFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object value, bool isDisabled, object htmlAttributes)
    {
        var linkAttributes = System.Web.Mvc.HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
        Dictionary<string, object> htmlAttributesDictionary = new Dictionary<string, object>();
        foreach (var a in linkAttributes)
        {
            if (a.Key.ToLower() != "disabled")
            {
                htmlAttributesDictionary.Add(a.Key, a.Value);
            }
        }

        if (isDisabled)
        {
            htmlAttributesDictionary.Add("disabled", "disabled");
        }

        return InputExtensions.RadioButtonFor<TModel, TProperty>(htmlHelper, expression, value, htmlAttributesDictionary);
    }

2 个答案:

答案 0 :(得分:5)

看起来您可能要将AnonymousObjectToHtmlAttributes应用两次或者应用于错误的项目。

如果没有更多代码,很难说出

var attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(new { id = "someID" });
attributes.Count = 1
attributes.Keys.First() = id

比较
var attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(new { id = "someID" }));
attributes.Count = 3
attributes.Keys.Join = Count,Keys,Values

在编写过载时,请确保object htmlAttributes部分的参数为:new { }IDictionary重载,例如:

Public static MvcHtmlString MyRadioButtonFor(..., object htmlAttributes)
{
    return MyRadioButtonFor(...., HtmlHelper.AnonymousObjectToHtmlAttrbites(htmlAttributes);
}

public static MvcHtmlString MyRadioButtonFor(..., IDictionary<string, object> htmlAttributes)
{
    htmlAttributes.Add("item", item);
    return RadioButtonFor(..., htmlAttributes);
}

(只是为了清楚,永远不要使用我的... - 它只是为了说明)

答案 1 :(得分:0)

不清楚为什么你不会只使用接受object htmlAttributes的现有重载来添加disabled="disabled"属性,但以下内容应该有效

public static MvcHtmlString RadioButtonFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object value, bool isDisabled, object htmlAttributes)
{
    IDictionary<string, object> attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
    if (isDisabled && !attributes.ContainsKey("disabled"))
    {
        attributes.Add("disabled", "disabled");
    }
    return InputExtensions.RadioButtonFor<TModel, TProperty>(htmlHelper, expression, value, attributes);
}