如何连接几个MvcHtmlString实例

M4N*_*M4N 68 html-helper mvchtmlstring asp.net-mvc-2

我对如何连接MvcHtmlString实例有一些疑问,因为在MSDN中找到了这些信息:

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());
Run Code Online (Sandbox Code Playgroud)

(注意:这应该进入HtmlHelper扩展方法以减少视图中的代码重复).

Rya*_*yan 57

太糟糕的C#不会让我们覆盖+运算符!如何使用扩展方法呢?

public static MvcHtmlString Concat(this MvcHtmlString first, params MvcHtmlString[] strings)
{
    return MvcHtmlString.Create(first.ToString() + string.Concat(strings.Select(s => s.ToString())));
}
Run Code Online (Sandbox Code Playgroud)

这可能是优化的,但你可以运行它.证明这不会通过单元测试对字符串进行双重编码应该是相当简单的.

使用范例:

label.Concat(textbox, validation)   
Run Code Online (Sandbox Code Playgroud)

现在我的博客是一个无耻的插件:使用TagBuilder或HtmlTags来清理你的HTML

  • 这不能为我编译,我已经改变了它:public static MvcHtmlString Concat(首先是MvcHtmlString,params MvcHtmlString [] strings){return MvcHtmlString.Create(first.ToString()+ string.Concat(strings.Select(s) => s.ToString()).ToArray())); } (2认同)
  • .NET 3.5 中不存在 IHtmlString (2认同)

mar*_*ind 27

你的代码是正确的.

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

例如:

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

<%: s %>  -- outputs "&lt;tag&gt;"
<%: hs %> -- outputs "<tag>"
Run Code Online (Sandbox Code Playgroud)


mig*_*elv 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());
    }
Run Code Online (Sandbox Code Playgroud)

它只是一个实用工具方法,我在类中使用HtmlHelper的扩展方法.