2014-12-06 94 views
0

我一直抨擊我的頭很長一段時間了,我很確定我錯過了一些非常明顯的東西。我想創建一個路徑鏈接,如果當前控制器動作匹配它,它可以動態地將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屬性?

回答

1

的問題是,你的目標RouteLink錯誤的過載,更改與以下

return html.RouteLink(linkText, routeName, new RouteValueDictionary(routeValues), myAttributes); 
+0

有趣return語句,似乎工作,但爲什麼呢?我通常使用這種超負荷,當我將其指定爲「新{...}」時,我不需要改變任何東西。對我來說似乎很奇怪。無論如何,謝謝你解決它..如果你可以進一步解釋爲什麼它的行爲不同,我會很高興,但我標記這是任何一種方式的答案。 – walther 2014-12-06 15:16:19

+0

要麼使用重載,其中routeValues是RouteValueDictionary,而htmlAttributes是IDictionary,或者使用其他重載,其中routeValues和htmlAttributes都是匿名對象。在你的第一種方法中,你將它們混合起來。 – 2014-12-06 23:00:36

相關問題