我真的很讨厌问题。 是否可以将routeValues作为对象和html属性作为字典传递?
我知道我可以将它们作为对象或两者都作为字典传递。
问题从这里开始: 我已经制作了一个扩展方法来为路由值字典或烦人的对象添加属性:
public static RouteValueDictionary SetAttributeValue(this object attributes, string attributeName, object attributeValue)
{
RouteValueDictionary htmlAttributes;
if (attributes == null)
{
htmlAttributes = new RouteValueDictionary();
}
else if (attributes.GetType() == typeof(RouteValueDictionary))
{
htmlAttributes = (RouteValueDictionary)attributes;
}
else
{
htmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(attributes);
}
htmlAttributes[attributeName] = attributeValue;
return htmlAttributes;
}
我正在使用它添加一些htmlattributes。就像在这个例子中一样:
public static MvcHtmlString NewWindowActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, object routeValues, object htmlAttributes)
{
return htmlHelper.ActionLink(linkText, actionName, controllerName, routeValues, htmlAttributes.SetAttributeValue("target", "_blank"));
}
问题是它执行这个方法:
public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, object routeValues, object htmlAttributes);
这种方法甚至不检查对象是否是字典类型。
因此,当使用带有对象而不是字典的actionlink时,我无法使我的扩展添加属性。
然后我想到了返回ExpandoObject:
public static object SetAttributeValue(this object attributes, string attributeName, object attributeValue)
{
RouteValueDictionary htmlAttributes;
if (attributes == null)
{
htmlAttributes = new RouteValueDictionary();
}
else if (attributes.GetType() == typeof(RouteValueDictionary))
{
htmlAttributes = (RouteValueDictionary)attributes;
}
else
{
htmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(attributes);
}
htmlAttributes[attributeName] = attributeValue;
return htmlAttributes.ToAnonymousObject();
}
public static object ToAnonymousObject(this IDictionary<string, object> @this)
{
var expandoObject = new ExpandoObject();
var expandoDictionary = (IDictionary<string, object>)expandoObject;
foreach (var keyValuePair in @this)
{
expandoDictionary.Add(keyValuePair);
}
return expandoObject;
}
当然,由于HtmlHelper.AnonymousObjectToHtmlAttributes;
那么有没有可能让它发挥作用? 我知道我总是可以将routeValues定义为RouteValueDictionary,但我问这个问题的原因是为了避免它