【问题标题】:MVC4 Disable validation for one actionMVC4 禁用一项操作的验证
【发布时间】:2013-10-22 19:35:38
【问题描述】:

我正在处理一个 MVC4 项目,我有一个操作我希望禁用验证,如下所示:

[HttpPost]
[ValidateAntiForgeryToken]
[ValidateInput(false)]
public ActionResult AddNewItems(AddNewItemsModel model, string postType)
{ ... }

即使我设置了 'ValidateInput(false)',应用程序仍坚持验证数据等。我已单步执行代码,并确认正在调用此操作,但似乎属性被忽略。是否有一些简单的替代方法可以使这项工作(尤其是不需要另一层模型等的方法)?

【问题讨论】:

  • 您是否尝试在此处找到解决方案:stackoverflow.com/questions/807662/…
  • 您尝试阅读问题了吗?
  • 我指的是(当前)有 105 个赞成票的答案,这表明 ASP.Net 4 上的请求在它到达控制器操作之前正在被验证,并且唯一的解决方案(同时仍在使用ValidateInputAttribute) 是通过 web.config 将验证模式恢复为 2.0 行为。我不明白你的问题的哪一部分?
  • 我怎么知道?如果你链接到一个有很多答案的页面,我怎么知道你在说什么?

标签: c# validation asp.net-mvc-4


【解决方案1】:

经过大量研究,我得出的结论是验证被深度集成到默认模型绑定器中,并且 MVC 基本上忽略了 ValidateInput 属性。我会注意到在 web.config 中使用以下内容

<system.Web>
  ...
  <httpRuntime requestValidationMode="2.0"/>

有时会纠正这种情况,但有时不会。我注意到这个设置与“ValidateInput”属性相结合只是间歇性地受到尊重,这使得它在 IMO 中毫无用处。最后我想出了一个动作过滤器,定义如下:

public class ClearModelErrorsAttribute : ActionFilterAttribute
{
  // ---------------------------------------------------------------------------------------
  public override void OnActionExecuting(ActionExecutingContext filterContext)
  {
    ModelStateDictionary msd = filterContext.Controller.ViewData.ModelState;
    foreach (var item in msd.Values)
    {
      item.Errors.Clear();
    }
  }
}

您可以看到它正在强力删除所有错误(由于无法关闭验证),这适用于我的特定场景。显然,这不是最强大的解决方案(也是一种 hack),但可以轻松修改它以适用于更具体的场景。

我的动作的新签名是这样的:

[HttpPost]
[ValidateAntiForgeryToken]
[ClearModelErrors]
public ActionResult AddNewItems(AddNewItemsModel model, string postType)
{ ... }

我已经从上面提到的 web.config 中删除了这些项目。

【讨论】:

    【解决方案2】:

    如果你知道哪个字段没有被验证,你可以像这样绕过验证:

    var myForbiddenValue = System.Web.Helpers.Validation.Unvalidated(Request).Form["MyForbiddenField"]
    

    或者您也可以遍历所有属性以取消它们的有效性。您可能需要在客户模型绑定器中完成这项工作。

    【讨论】:

    • 有趣。但是,我在表单上有几十个输入。有没有办法可以只包含整个表格? (不迭代道具)
    • System.Web.Helpers.Validation.Unvalidated(Request).Form 为您提供所有表单值而不验证它们,您仍然必须迭代属性以获取它们的所有值。
    猜你喜欢
    • 2014-02-19
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多