我一直在抨击我的头很长一段时间,我很确定我错过了一些非常明显的东西。我想创建一个路由链接,如果当前控制器动作匹配它,可以动态地将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属性...如果尝试使用字典,结果显示在上面...请,任何人都可以向我解释,为什么它表现得像这样以及如何我可以解决这个问题吗?
答案 0 :(得分:1)
问题是您的目标是RouteLink的错误重载,请使用以下
更改return语句return html.RouteLink(linkText, routeName, new RouteValueDictionary(routeValues), myAttributes);