如何连接几个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 "<tag>" <%: 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的扩展方法在类中使用。