Asp.net mvc 2 如何连接多个MvcHtmlString实例

Asp.net mvc 2 如何连接多个MvcHtmlString实例,asp.net-mvc-2,html-helper,mvchtmlstring,Asp.net Mvc 2,Html Helper,Mvchtmlstring,由于以下信息,我对如何连接MvcHtmlString实例有一些疑问: MvcHtmlString类表示一个HTML编码的字符串,该字符串 不应再次进行编码 在使用以下代码时,我是否有可能对字符串进行两次HTML编码: var label = Html.LabelFor(model => model.Email); var textbox = Html.TextBoxFor(model => model.Email); var validation = Html.ValidationM

由于以下信息,我对如何连接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 "&lt;tag&gt;"
<%: hs %> -- outputs "<tag>"
string s=”“;
var hs=MvcHtmlString.Create;
--输出“标签”
--输出“”
太糟糕了,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)   

现在我的博客有了一个无耻的插件:

我采用了这种方法:

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

我知道这非常古老,但另一种方法(我发现更优雅)是使用字符串方法Concat的重载,它是元数据定义

public static String Concat(params object[] args);
这基本上是对传入的每个对象进行字符串化,然后连接结果并返回连接的字符串

因此,最终结果将是:

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

这不是为我编译的,我更改了它:public static MvcHtmlString Concat(首先是这个MvcHtmlString,然后是参数MvcHtmlString[]strings){返回MvcHtmlString.Create(首先是.ToString()+string.Concat(strings.Select(s=>s.ToString()).ToArray());}输入参数不是
IHtmlString
有什么原因吗?IHtmlString在.NET 3.5中不存在