0

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

所以当你制作 HTML 助手时,现在使用这种方式更好吗(前提是你不想做 HTML 编码)?

4

2 回答 2

2

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

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

现实生活中的例子

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

  1. 将评论存储在数据库中时对其进行清理和格式化- 在这种情况下,您将从提交的评论中删除所有 HTML 标记,然后将所有新行 (\n) 替换为<br/>. 当您想显示此评论时,您可以致电<%= Comment %>
  2. 显示注释时清理和格式化注释- 在这种情况下,您很可能会调用它<%= Html.Encode(Comment).Replace("\n", "<br/>") %>

哪个更好/更安全取决于每个特定情况,但清理 HTML 标记始终是包含在两者中的任何一个中的一个不错的步骤。一切还取决于允许的格式定义。是否应该将这些作为常规标签或类似于降价的东西或完全不同的东西输入取决于您,最终的代码肯定会取决于它。

第二种方法的优点/缺点

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

<%: Model.CustomerName %>是的,从现在开始,您总是想在可以使用的地方使用。只有在非常特殊的情况下才应该使用<%= %>但尽量不要使用它。

如果您正在创建自己不想被编码的 html 助手,那么只需MvcHtmlString从它们返回 a 。

例如,这是我创建的一个扩展方法,用于在传入的值为 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.

HTH,
Chares

于 2010-05-17T22:49:12.077 回答