如何连接几个MvcHtmlString实例

由于MSDN中的这些信息,我对如何连接MvcHtmlString实例有一些疑问:

MvcHtmlString类表示不应再次编码的HTML编码的string

使用这样的代码时,是否冒着string被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扩展方法来减less视图中的代码重复)。

你的代码是正确的。

来自MSDN的这段代码意味着一个编码视图引擎(如.NET 4中使用<%: %>时的Aspx视图引擎或MVC 3中的Razor视图引擎)不应重新编码该对象的string值。

举个例子:

 string s = "<tag>"; var hs = MvcHtmlString.Create(s); <%: s %> -- outputs "&lt;tag&gt;" <%: hs %> -- outputs "<tag>" 

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

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

这可能可以优化,但你可以运行它。 certificate这不会使用unit testing对string进行双重编码应该相当简单。

用法示例:

 label.Concat(textbox, validation) 

而现在我的博客无耻的插件: 使用TagBuilder或HtmlTags来清理您的HTML

我采取了这种方法:

  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的扩展方法在类中使用。