【问题标题】:Display Friendly Error Message When Html tag is entered in a text Box- MVC ASP.NET在文本框中输入 Html 标记时显示友好的错误消息-MVC ASP.NET
【发布时间】:2011-09-12 14:46:42
【问题描述】:

我需要验证文本框中的用户输入。每当输入 html 标记时,它应该显示相同的视图,并带有友好的错误消息,例如“无法输入 html 标记”。

到目前为止我尝试过的方法是:

  1. 控制器上的[ValidateInput(true)] - 出现错误“潜在危险请求”
  2. 控制器上的[ValidateInput(false)]-它将值存储在数据库中-(我不想要这个)
  3. 在视图模型中,我为属性[RegularExpression ( "<([A-Z][A-Z0-9]*)\b[^>]*>(.*?)</\1>",ErrorMessage = "You have entered html…Html is not a valid input!" )] 放置了一个标签

任何人都有这个问题。如果是,请告诉我,你是如何解决这个问题的。

谢谢

【问题讨论】:

  • 选项 3 有什么问题?
  • 正则表达式应该是您的输入应该匹配的内容。所以你应该有没有<或>的正则表达式
  • 它抱怨正则表达式转义序列-]*>(.*?)\1>- - 抱怨倒数第三个字符 '\'-- 错误信息无法识别转义序列。

标签: asp.net-mvc-3


【解决方案1】:

您可以使用[AllowHtml] 属性:

[AllowHtml]
[RegularExpression (@"^[^<>]*$", ErrorMessage = "You have entered html... Html is not a valid input!" )]
public string SomePropertyThatShouldNotAcceptHtml { get; set; }

显然,在存储到数据库之前,您应该确保内容是安全的:

[HttpPost]
public ActionResult Save(MyViewModel model)
{
    if (!ModelState.IsValid) 
    {
        // the model is invalid => redisplay view
        return View(model);
    }

    // the model passed validation => store in the database    
    ...
    return RedirectToAction("Success");
}

如果你害怕 XSS,你可以使用AntiXSS library,它会从 HTML 中过滤掉所有危险的脚本。您甚至可以编写一个自定义模型绑定器,该绑定器将执行此步骤并自动为属性分配一个安全的 HTML 值。

【讨论】:

  • 它抱怨正则表达式转义序列-]*>(.*?)\1>- - 抱怨倒数第三个字符 '\'-- 错误信息无法识别转义序列。
  • @StewieFG,我已经用新的正则表达式更新了我的答案。如果你想使用你的正则表达式,你可以这样做:[RegularExpression (@"&lt;([A-Z][A-Z0-9]*)\b[^&gt;]*&gt;(.*?)&lt;/\1&gt;",ErrorMessage = "You have entered html…Html is not a valid input!" )]。注意字符串序列开头的@ 字符。
  • @StewieFG,正则表达式使用@ 编译。如果它不起作用,可能是因为它不正确。那是另一个问题。我在回答中建议您使用正则表达式,以确保输入不包含 &lt; 和 &gt;。
【解决方案2】:

早上好,这看起来是一个很好的起点,可以满足您的要求。看看这个article。

【讨论】:

    【解决方案3】:

    通过显示友好的错误消息,它现在正在工作。通过在 Post Action 控制器中添加 Validateinput 标记,我进行了一些更改。

    我必须在 ViewModel 中添加这个

    [AllowHtml]
    [RegularExpression (@"^[^<>]*$", ErrorMessage = "You have entered html... Html is not a valid input!" )]
    public string SomePropertyThatShouldNotAcceptHtml { get; set; }
    

    在动作控制器中

    我必须在 Post Event 中添加标签

    [Validateinput(false)]
    

    谢谢达林。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-14
      • 2011-06-05
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多