69

由于在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

4 回答 4

60

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

于 2010-08-12T03:52:50.873 回答
28

Your code is correct.

That snippet from MSDN means that an encoding View Engine (such as the Aspx view engine in .NET 4 when using <%: %> or the Razor view engine in MVC 3) should not re-encode the string value of the object.

So for example:

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

<%: s %>  -- outputs "&lt;tag&gt;"
<%: hs %> -- outputs "<tag>"
于 2010-08-11T18:22:00.717 回答
21

我采用了这种方法:

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

于 2010-12-05T17:06:48.447 回答
4

我知道这已经很老了,但是另一种方法(我发现它更优雅)是使用 String 方法 Concat 的重载,它的元数据定义是

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

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

所以最终的结果是:

var result = MvcHtmlString.Create(
    string.Concat(
        label, textbox, validation
    )
);
于 2018-01-05T21:26:58.543 回答