在ASP.Net核心禁用模型验证2 MVC
在控制器设置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
而没有成功,所以想知道是否有更好/正确的方法来关闭验证?
.AddMvc()
扩展方法有一个重载,您可以在其中配置很多东西。其中之一是ModelValidatorProviders
的列表。
如果清除该列表,例如:
services.AddMvc(options => options.ModelValidatorProviders.Clear());
验证不应该发生的任何更长的时间。
同样不幸的是,这是堆栈的一部分:'\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' –
相同的是什么?您是 – ypsilo0n
不,我的意思是它仍然调用DefaultObjectValidator,我想在“我们有验证器,如果没有添加DefaultObjectValidator”的行中存在一些代码) –
我认为你的解决方案很好。你可以简化依赖注册:'services.AddSingleton(new NonValidatingValidator());' –
thejman