代码之家  ›  专栏  ›  技术社区  ›  M4N

如何连接多个MvcHtmlString实例

  •  68
  • M4N  · 技术社区  · 14 年前

    我对如何连接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());
    

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

    4 回复  |  直到 14 年前
        1
  •  27
  •   marcind    14 年前

    你的代码是正确的。

    <%: %> 或者mvc3中的Razor视图引擎不应该重新编码对象的字符串值。

    例如:

    string s = "<tag>";
    var hs = MvcHtmlString.Create(s);
    
    <%: s %>  -- outputs "&lt;tag&gt;"
    <%: hs %> -- outputs "<tag>"
    
        2
  •  58
  •   Piotr Szmyd    12 年前

    太糟糕了,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)   
    

    现在是我博客的无耻插件: Use TagBuilder or HtmlTags to clean up your HTML

        3
  •  21
  •   miguelv    14 年前

        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
  •  4
  •   Nahuel Prieto    7 年前

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

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

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

    所以最终的结果是:

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