2017-09-23 63 views
2
正确方法

在控制器设置MVC与扩展方法在ASP.Net核心禁用模型验证2 MVC

services.AddMvc() 

然后,这可能也适用于GET,创建POST操作的方法在体内提供一个参数,例如

[HttpPost("save")] 
public Entity Save([FromBody]Entity someEntity) 

当动作被称为MVC管道将调用依次调用DefaultObjectValidator的ParameterBinder。我不想验证(它缓慢的一两件事,但更重要的是循环的复杂周期图形),但似乎关闭验证,在管道中的唯一方法是这样的:

public class NonValidatingValidator : IObjectModelValidator 
{ 
    public void Validate(ActionContext actionContext, ValidationStateDictionary validationState, string prefix, object model) 
    { 
    } 
} 

并在启动/ ConfigureServices:

 var validator = services.FirstOrDefault(s => s.ServiceType == typeof(IObjectModelValidator)); 
     if (validator != null) 
     { 
      services.Remove(validator); 
      services.Add(new ServiceDescriptor(typeof(IObjectModelValidator), _ => new NonValidatingValidator(), ServiceLifetime.Singleton)); 
     } 

这似乎像一个大锤。我环顾四周,无法找到替代品,也试图删除DataAnnotationModelValidator而没有成功,所以想知道是否有更好/正确的方法来关闭验证?

+0

我认为你的解决方案很好。你可以简化依赖注册:'services.AddSingleton (new NonValidatingValidator());' – thejman

回答

0

.AddMvc()扩展方法有一个重载,您可以在其中配置很多东西。其中之一是ModelValidatorProviders的列表。

如果清除该列表,例如:

services.AddMvc(options => options.ModelValidatorProviders.Clear()); 

验证不应该发生的任何更长的时间。

+0

同样不幸的是,这是堆栈的一部分:'\t \t Microsoft.AspNetCore.Mvc.Core.dll!Microsoft。 AspNetCore.Mvc.Internal.DefaultObjectValidator.Validate(Microsoft.AspNetCore.Mvc.ActionContext actionContext,Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationStateDictionary validationState,字符串前缀,对象模型)\t未知\t非用户代码。跳过的加载符号。 \t Microsoft.AspNetCore.Mvc.Core.dll!Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder.BindModelAsync(Microsoft.AspNetCore.Mvc.ActionContext actionContext,Microsoft.AspNetCore.Mvc.ModelBinding.IModelBinder modelBinder' –

+0

相同的是什么?您是 – ypsilo0n

+0

不,我的意思是它仍然调用DefaultObjectValidator,我想在“我们有验证器,如果没有添加DefaultObjectValidator”的行中存在一些代码) –