如何连接几个MvcHtmlString实例

时间:2010-08-11 16:49:25

标签: asp.net-mvc-2 html-helper mvchtmlstring

由于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扩展方法以减少视图中的代码重复。)

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:26)

您的代码是正确的。

来自MSDN的片段意味着编码视图引擎(例如.NET 4中使用<%: %>时的Aspx视图引擎或MVC 3中的Razor视图引擎)不应重新编码字符串的值对象

例如:

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

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

答案 2 :(得分:20)

我采用了这种方法:

    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的扩展方法。

答案 3 :(得分:2)

我知道这是超级旧的,但另一种方式(我觉得更优雅),是使用String方法Concat的重载,其元数据定义是

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

基本上ToStrings传入的每个对象然后连接结果并返回连接的字符串。

所以最终的结果是:

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