扩展HtmlHelper RouteLink

时间:2014-12-06 14:23:17

标签: c# asp.net-mvc

我一直在抨击我的头很长一段时间,我很确定我错过了一些非常明显的东西。我想创建一个路由链接,如果当前控制器动作匹配它,可以动态地将css类设置为“selected”。但是,我很难修改我需要传递的现有htmlAttributes。

public static MvcHtmlString RouteLinkSelectable(this HtmlHelper html, string linkText, string routeName, object routeValues, object htmlAttributes, string controller = null, string action = null)
{
        // omitting code for determining if the class should be set, because it
        // doesn't modify the behavior. It does that same thing with the following code

        var myAttributes = new Dictionary<string, object>
        {
            { "data-myattribute1", "value1" },
            { "data-myattribute2", "value2" }
        };

        var attributes = new RouteValueDictionary(htmlAttributes);
        // now merge them with the user attributes
        foreach (var item in attributes)
        {
            // remove this test if you want to overwrite existing keys
            if (!myAttributes.ContainsKey(item.Key))
            {
                myAttributes[item.Key] = item.Value;
            }
        }

        return html.RouteLink(linkText, routeName, routeValues, myAttributes);    
 }

这是Darin Dimitrov在这个答案中提出的代码(我一直在尝试的变种之一)https://stackoverflow.com/a/12729240/1289283

这应该有用,对吗?好吧,不完全是..

当我从我的布局中调用它时:

@Html.RouteLinkSelectable("profil", "Default", null, new { id = "lnkProfile" }, action: "Index")  

它产生这个输出:

<a Comparer="System.Collections.Generic.GenericEqualityComparer`1[System.String]" Count="3" Keys="System.Collections.Generic.Dictionary`2+KeyCollection[System.String,System.Object]" Values="System.Collections.Generic.Dictionary`2+ValueCollection[System.String,System.Object]" href="/">profil</a>

如果我修改代码以使用经典语法(...., new { id = "lnkProfile" }),那么效果很好。如果我创建一个具有属性的新类,它的效果很好。如果我使用expando对象,它不会附加任何html属性...如果尝试使用字典,结果显示在上面...请,任何人都可以向我解释,为什么它表现得像这样以及如何我可以解决这个问题吗?

顺便说一下,我当然可以从头开始创建一个链接,但是为什么我只需要动态添加一个html属性就可以重新发明轮子?

1 个答案:

答案 0 :(得分:1)

问题是您的目标是RouteLink的错误重载,请使用以下

更改return语句
return html.RouteLink(linkText, routeName, new RouteValueDictionary(routeValues), myAttributes);