【问题标题】:client side validation for asp.net mvc “A potentially dangerous Request.Form…asp.net mvc 的客户端验证“潜在危险的 Request.Form…
【发布时间】:2015-01-05 15:01:54
【问题描述】:

我想了解如何在 asp.net mvc 中为潜在危险的 request.form 实现客户端验证。

我不想在这种情况下设置[ValidateInput(false)],并且向用户显示此错误消息页面对用户不友好。类似于[Required] 属性对客户端验证所做的事情。

我假设有一个内置函数,因为这对我来说似乎是一个常见问题,但我似乎无法找到它。

【问题讨论】:

  • 客户端验证需要客户端代码。我建议使用 jQuery 和 jQuery Validate 插件:jqueryvalidation.org
  • 我知道那里有大量可用的 javascript 客户端验证,但我在这里面临的问题不是重新发明轮子来重写可能与 asp.net mvc 匹配的验证规则危险的 request.form,既不限制输入只允许字母数字
  • 为此讨论客户端验证等价物并没有什么意义,因为这超出了简单的表单验证。请求 URL、cookie 等也通过 ASP.NET 请求验证进行验证,因此您可能必须实现自己的 JavaScript 挂钩到每个表单帖子并在发送之前验证整个 HTTP 请求。你确定这真的是你需要做的吗?请求验证是一种安全功能,而不是可用性功能,因此请求验证失败应该被视为异常而不是表单验证错误。
  • 您可能过度使用了解决方案 - 您能否具体概述您要解决的问题 - 即您希望在无害请求中验证哪些值集以及提交的位置和方式?

标签: javascript asp.net-mvc asp.net-mvc-4 unobtrusive-validation


【解决方案1】:

您可以通过覆盖DefaultModelBinder.BindModel方法来捕获HttpRequestValidationExceptionduring 模型绑定。

public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        try
        {
            return base.BindModel(controllerContext, bindingContext);
        }
        catch (HttpRequestValidationException)
        {
            bindingContext.ModelState.AddModelError(bindingContext.ModelName, "Illegal Html characters...");
            return null;
        }
    }

在您的控制器操作中,您现在可以检查模型是否无效并根据需要重新显示视图。 jQuery 不显眼的验证应该负责其余的工作。

    [HttpPost]
    public virtual ActionResult Edit(ViewModel model)
    {
        if (!ModelState.IsValid)
        {                               
            return View(model);
        }
    }

如果您还没有自定义DefaultModelBinder,您必须确保在应用程序启动时注册它。

ModelBinders.Binders.DefaultBinder = new CustomDefaultModelBinder();

【讨论】:

    猜你喜欢
    • 2018-03-19
    • 1970-01-01
    • 2015-02-05
    • 2014-02-11
    • 1970-01-01
    • 2012-05-06
    • 2010-12-20
    • 2012-05-29
    相关资源
    最近更新 更多