如何串联多个MvcHtmlString实例


68

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

Answers:


27

您的代码是正确的。

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

因此,例如:

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

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

58

糟糕的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


2
这不是为我编译的,我已对其进行了更改:公共静态MvcHtmlString Concat(此MvcHtmlString首先,参数MvcHtmlString []字符串){返回MvcHtmlString.Create(first.ToString()+ string.Concat(strings.Select(s => s.ToString())。ToArray())); }
查理

输入参数不是原因IHtmlString吗?
马斯洛

1
IHtmlString在.NET 3.5中不存在
Ryan

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扩展方法的实用程序方法。


4

我知道这是非常古老的方法,但是另一种方法(我觉得更优雅)是使用String方法Concat的重载,该方法的元数据定义为

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

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

因此最终结果将是:

var result = MvcHtmlString.Create(
    string.Concat(
        label, textbox, validation
    )
);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.