你使用<%:%>或<%=%> ASP.NET MVC 2.0中的html助手?

时间:2010-05-17 20:59:09

标签: asp.net-mvc-2 asp.net-4.0 html-encode

我知道他们现在在ASP.NET MVC 2.0 <%: Model.CustomerName %>

中有这个

因此,当您制作HTML帮助程序时,现在最好以这种方式使用(假设您不想进行HTML编码)?

2 个答案:

答案 0 :(得分:2)

每当您显示用户输入/提交的数据以使您的网页更安全时,都应使用<%: %>

但有时HTML编码所有内容都不可行。如果你想保留一些HTML格式怎么办?在这种情况下,您将不得不使用常规<%= %>语句。让我们想一个这种情况的例子。

现实生活中的例子

假设您有一些网络内容,用户可以在其中提交评论。您希望提供保留某些格式(至少换行符)的功能。在这种情况下,您将在以后显示这些注释时保留<br/>个元素。你有两个选择:

  1. 在将数据存储到数据库中时清理和格式化注释 - 在这种情况下,您将从提交的注释中删除所有HTML标记,然后用<br/>替换所有新行(\ n) 。如果您想显示此评论,可以拨打<%= Comment %>
  2. 在您显示评论时清理和格式化评论 - 在这种情况下,您最有可能称之为<%= Html.Encode(Comment).Replace("\n", "<br/>") %>
  3. 哪一个更好/更安全取决于每个特定情况,但清理HTML标签始终是包含在两者中的任何一个中的一个很好的步骤。一切还取决于允许的格式定义。如果将它们作为常规标签输入或类似于降价或类似的东西取决于您,最终的代码肯定取决于它。

    第二种方法优点/缺点

    • 优点
      假设您确实提供了一些格式化功能,但大约一年左右后,您决定更改格式规则或与其相关的内容(这很常见)。如果您使用第二种方法,新规则也适用于旧注释,因为它们按原样存储,而第一种方法将失去其与旧数据的重要性。例如,如果您在清理/格式化阶段自动检测这些注释中的Web链接。使用第一种方法旧评论中的所有链接都将保持不可点击,但如果您使用第二种方法,即使是带链接的较旧评论也会将其格式化为可点击。
    • 缺点
      第二种方法比第一种方法使用更多的处理,因为每次评论都必须在每次显示时进行预处理,而在第一种方法中,只有当我们将它们存储在数据库中时,它们才会被处理一次。根据每页上的格式/清理复杂性和评论数量,这可能会变得很重要 如果处理确实成为问题,您应该考虑使用第一种方法的替代方法,但在清理和重新格式化注释时,您将在数据库中保存两个版本。原始提交的评论以及已处理的评论。因此,当您更改格式规则时,您始终可以重新格式化旧注释,因为您存储了原件。

答案 1 :(得分:1)

是的,从现在开始,您总是希望使用<%: Model.CustomerName %>。只有在非常特殊的情况下,您才应该使用<%= %>但是根本不要使用它。

如果您要创建自己不希望被编码的html帮助器,那么只需从它们返回MvcHtmlString

E.g。这是我创建的扩展方法,如果传入的值为true,则显示勾号图标。

public static MvcHtmlString MECross(this HtmlHelper html, string value, string text)
{
    if (Convert.ToBoolean(value))
    {
        string spanTag = string.Format("<span class=\"replace icon-cross\" title=\"{0}\"><em></em>{1}</span>",
                                        html.AttributeEncode(text),
                                        html.Encode(text));

        return MvcHtmlString.Create(spanTag);
    }

    return MvcHtmlString.Empty;
}

请注意,我EncodeAttributeEncode在我的扩展方法中可能存在危险的任何内容,然后返回MvcHtmlString

HTHS,
Chares