MVC routeValues作为对象,html属性作为字典

时间:2015-08-13 16:43:16

标签: c# asp.net-mvc razor

我真的很讨厌问题。 是否可以将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,但我问这个问题的原因是为了避免它

0 个答案:

没有答案