Asp.net-Mvc-2

如何連接多個 MvcHtmlString 實例

  • August 11, 2010

由於在MSDN中找到了以下資訊,我對如何連接 MvcHtmlString 實例有一些疑問:

MvcHtmlString 類表示不應再次編碼的 HTML 編碼字元串

使用這樣的程式碼時,我是否冒著兩次對字元串進行 HTML 編碼的風險:

var label = Html.LabelFor(model => model.Email);
var textbox = Html.TextBoxFor(model => model.Email);
var validation = Html.ValidationMessageFor(model => model.Email);

var result = MvcHtmlString.Create(
 label.ToString() + textbox.ToString() + validation.ToString());

(注意:這應該進入 HtmlHelper 擴展方法以減少視圖中的程式碼重複)。

你的程式碼是正確的。

來自 MSDN 的該片段意味著編碼視圖引擎(例如使用時 .NET 4 中的 Aspx 視圖引擎<%: %>或 MVC 3 中的 Razor 視圖引擎)不應重新編碼對象的字元串值。

例如:

string s = "<tag>";
var hs = MvcHtmlString.Create(s);

<%: s %>  -- outputs "<tag>"
<%: hs %> -- outputs "<tag>"

太糟糕了 C# 不允許我們在這裡覆蓋 + 運算符!改用擴展方法怎麼樣?

public static MvcHtmlString Concat(this MvcHtmlString first, params MvcHtmlString[] strings)
{
   return MvcHtmlString.Create(first.ToString() + string.Concat(strings.Select(s => s.ToString())));
}

這可能會被優化,但您可以使用它執行。證明這不會通過單元測試對字元串進行雙重編碼應該是相當簡單的。

使用範例:

label.Concat(textbox, validation)   

現在是我部落格的無恥外掛:使用 TagBuilder 或 HtmlTags 清理您的 HTML

引用自:https://stackoverflow.com/questions/3460762