我一直抨擊我的頭很長一段時間了,我很確定我錯過了一些非常明顯的東西。我想創建一個路徑鏈接,如果當前控制器動作匹配它,它可以動態地將css類設置爲「selected」。這很容易,但是,我有麻煩修改現有htmlAttributes我需要傳遞。擴展HtmlHelper RouteLink
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);
}
這是代碼,在建議的達林季米特洛夫(我一直在嘗試變化的井之一)這個答案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屬性?
有趣return語句,似乎工作,但爲什麼呢?我通常使用這種超負荷,當我將其指定爲「新{...}」時,我不需要改變任何東西。對我來說似乎很奇怪。無論如何,謝謝你解決它..如果你可以進一步解釋爲什麼它的行爲不同,我會很高興,但我標記這是任何一種方式的答案。 – walther 2014-12-06 15:16:19
要麼使用重載,其中routeValues是RouteValueDictionary,而htmlAttributes是IDictionary,或者使用其他重載,其中routeValues和htmlAttributes都是匿名對象。在你的第一種方法中,你將它們混合起來。 – 2014-12-06 23:00:36