我正在为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);
}
答案 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);
}