禁用Asp.Net MVC中的模型验证

Mar*_*inF 8 validation model-view-controller asp.net-mvc model

如何在Controller中禁用单个Action的模型验证?或者我可以通过在启动时注册模型类型来为每个模型执行此操作吗?

我希望ModelBinder绑定到模型,但之后它不应该执行模型验证.

我不希望验证发生的原因是因为我试图将逻辑从控制器移动到服务层,该服务层将负责验证模型,因为我不能假设传递给服务的模型包含有效数据.

据我所知,这是推荐的方法(在控制器中没有逻辑),所以我觉得有点奇怪,我似乎无法找到任何关于如何禁用模型验证(每个动作或每个模型类型).

请注意,我不想禁用整个Web应用程序的模型验证(通过删除验证提供程序),并且我不想禁用检查发布的恶意代码的输入验证.


UPDATE

我正在使用.Net 4.0和MVC 3预览1

Alf*_*ñoz 12

在检查模型是否有效之前,只需删除不需要的项目

ModelState.Remove("Email");
if (ModelState.IsValid)
{
   // your logic
}
Run Code Online (Sandbox Code Playgroud)


Fra*_*sco 10

我用这段代码解决了这个问题:

public ActionResult Totals(MyModel model)
{
    ModelState.Clear();
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

不确定这是正确的方式.

  • 模型状态数据不仅仅包含验证.通过清除模型状态,您也将失去其他功能. (5认同)

Mar*_*inF 3

不幸的是,除了使用特定的 ModelBinder 注册您不想验证的每个模型类型(包括嵌套的复杂类型)之外,似乎没有简单的方法可以禁用 ModelBinder 中发生的模型验证。可以使用以下代码来完成:

\n\n

\nModelBinders.Binders[typeof(MyModelType)] = new NonValidatingModelBinder();\n

\n\n

创建一个可以附加到操作方法或操作方法参数的 SkipValidationAttribute 似乎不太可能,因为它应该在 ControllerActionInvoker 中实现,但是没有办法让 ModelBinder 知道它应该在在 GetParameterValue() 方法中调用 BindModel() 时的 SetProperty() 和 OnModelUpdated 方法。

\n