2012-02-29 66 views
4

在我的MVC應用程序中,我有一個幫助器類,用於呈現一組相關的按鈕。我想在按鈕的HTML屬性傳遞作爲一個匿名對象:如何將匿名對象轉換爲鍵/值對或HTML屬性?

new { @class="myClass1 myClass2" } 

助手發出HTML作爲MvcHtmlString,這我目前正在建設這樣的:

 foreach (var b in _buttons) 
     { 
      sb.AppendFormat("<button type='submit' name='{0}' {1}>{2}</button>", 
       b.Value, 
       b.HtmlAttributes, 
       b.Text); 
     } 

我的問題是,上面的代碼會產生無效的HTML:

<button type='submit' name='Foo' { class = myClass1 myClass2 }>Bar</button> 

不幸的是,因爲它傳遞給助手爲object,我沒有類型信息的工作。我可以用ToString這個對象解析結果,但是這看起來很愚蠢。如何以編程方式將匿名對象轉換爲key="value"樣式的HTML屬性?是否有這樣的現有工具?

回答

14

您應該使用TagBuilder類,它爲您構建HTML標記。

然後,您可以編寫

builder.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(HtmlAttributes)); 
+0

我沒有在最終版本中使用TagBuilder,但感謝讓我知道它存在。 +1。 – 2012-02-29 19:22:56

+0

更新:這不是我用過的方法,但那是因爲我的情況有點獨特。 'TagBuilder'是最佳實踐,所以我接受了這個答案。 – 2012-03-30 13:56:37

+0

你太棒了。 – 2012-12-20 21:20:37

3

事實證明,有對HtmlHelper類的靜態方法是:

HtmlHelper.AnonymousObjectToHtmlAttributes(b.HtmlAttributes) 

這解決了我的問題:

foreach (var b in _buttons) 
    { 
     var dict = HtmlHelper.AnonymousObjectToHtmlAttributes(b.HtmlAttributes); 

     var attr = dict.Keys.Zip(
      dict.Values, 
      (k, v) => string.Format("{0}='{1}'", k, v)); 

     sb.AppendFormat("<button type='submit' name='{0}' {1}>{2}</button>", 
      b.Value, 
      string.Join(" ", attr), 
      b.Text); 
    } 

我也使用TagBuilder嘗試了它,並獲得了相同數量的代碼。


編輯:作爲Slaks指出,做這種方式是一個潛在的XSS漏洞。在我的具體用例中沒有風險,但TagBuilder看起來是最佳實踐。

+3

但是,您的版本是XSS漏洞。使用'TagBuilder';不要重新發明輪子。 – SLaks 2012-02-29 19:54:06

+0

@Slaks - 我可以控制進入HTML的值,它們是一組有限的值,不是來自用戶輸入。雖然,採取了點。 – 2012-02-29 20:44:11

+0

在構建複雜的組件時,我發現這個答案很有用,因爲您不需要對HTML進行完全控制。 – 2013-03-09 22:31:25

相關問題