如果我想为htmlhelper扩展方法支持类似结构的ctors,那么当编写htmlhelper扩展时,我使用RouteValueDictionary
如下:
public static string ListBoxDict(this HtmlHelper htmlHelper,
string name,
object value,
object htmlAttributes)
{
return ListBoxDict(htmlHelper,
name,
value,
((IDictionary<string, object>)
new RouteValueDictionary(htmlAttributes)));
}
我的问题确实是为什么需要RouteValueDictionary
...我知道你不能只将htmlAttributes
强加给IDictionary<string, object>
......虽然我不确定为什么和那可能是我困惑的地方。不应该RouteValueDictionary
与路由有关,因此与HtmlHelper方法无关?就像我说的那样,我可能会忽略这一点,所以如果有人能告诉我我错过了什么,我会很高兴。
干杯...
编辑:回应丹的回答 - &gt;
我只是按照我在mvc源代码中看到的用于输入助手的内容......
src\SystemWebMvc\Mvc\Html\InputExtensions.cs
”它的确如下:
public static string TextBox(this HtmlHelper htmlHelper,
string name,
object value,
object htmlAttributes)
{
return TextBox(htmlHelper,
name,
value,
new RouteValueDictionary(htmlAttributes))
}
显然是捷径,但这是一种混蛋,还是可以做到?
答案 0 :(得分:5)
我强烈建议看看Rob Conery的blog post这样的事情。
它的肉和蔬菜是这样的:
<强> Codedump:强>
public static string ToAttributeList(this object list)
{
StringBuilder sb = new StringBuilder();
if (list != null)
{
Hashtable attributeHash = GetPropertyHash(list);
string resultFormat = "{0}=\"{1}\" ";
foreach (string attribute in attributeHash.Keys)
{
sb.AppendFormat(resultFormat, attribute.Replace("_", ""),
attributeHash[attribute]);
}
}
return sb.ToString();
}
public static string ToAttributeList(this object list,
params object[] ignoreList)
{
Hashtable attributeHash = GetPropertyHash(list);
string resultFormat = "{0}=\"{1}\" ";
StringBuilder sb = new StringBuilder();
foreach (string attribute in attributeHash.Keys)
{
if (!ignoreList.Contains(attribute))
{
sb.AppendFormat(resultFormat, attribute,
attributeHash[attribute]);
}
}
return sb.ToString();
}
public static Hashtable GetPropertyHash(object properties)
{
Hashtable values = null;
if (properties != null)
{
values = new Hashtable();
PropertyDescriptorCollection props =
TypeDescriptor.GetProperties(properties);
foreach (PropertyDescriptor prop in props)
{
values.Add(prop.Name, prop.GetValue(properties));
}
}
return values;
}
<强>用法:强>
public static string ListBoxDict(this HtmlHelper htmlHelper,
string name,
object value,
object htmlAttributes)
{
return htmlHelper.ListBoxDict(name,
value,
htmlAttributes.ToAttributeList()));
}
.ToAttributeList()
做的是将htmlAttribute对象转换为
name =“value”
希望这是有道理的。