2010-08-11 99 views
67

我有關於如何連接,因爲在MSDN發現這個信息MvcHtmlString情況下有些疑惑:如何連接幾個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擴展方法以減少視圖中的代碼重複)。

回答

26

您的代碼是正確的。

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

因此,例如:

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

<%: s %> -- outputs "&lt;tag&gt;" 
<%: hs %> -- outputs "<tag>" 
57

太糟糕了,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) 

現在我的博客一個無恥的插頭:Use TagBuilder or HtmlTags to clean up your HTML

+2

這不編譯對我來說,我已經改變了它: \t公共靜態MvcHtmlString的毗連(這MvcHtmlString第一,PARAMS MvcHtmlString []字符串) \t {first.ToString()+ string.Concat(strings.Select(s => s.ToString())。ToArray()));}。 \t} – Charlie 2012-04-13 16:38:35

+0

是否有輸入參數不是IHtmlString的原因? – Maslow 2013-12-09 19:45:43

+1

IHtmlString不存在於。NET 3.5 – Ryan 2013-12-10 22:20:34

19

我去這種方法:

private static MvcHtmlString Concat(params MvcHtmlString[] items) 
    { 
     var sb = new StringBuilder(); 
     foreach (var item in items.Where(i => i != null)) 
      sb.Append(item.ToHtmlString()); 
     return MvcHtmlString.Create(sb.ToString()); 
    } 

這只是我用裏面的實用工具方法帶有HtmlHelper擴展方法的類。

0

我知道這是超級老了,但另一種方式(我覺得這是更優雅),是使用String方法concat,這個元數據定義是

public static String Concat(params object[] args); 

,基本上ToStrings過載每個對象都傳入並連接結果並返回連接的字符串。

所以最終的結果將是:

var result = MvcHtmlString.Create(
    string.Concat(
     label, textbox, validation 
    ) 
);