我喜欢自动HTTP 400响应在ASP.NET Core2.1中的新功能,它在大多数情况下效果都很好。
但是,在一个操作中,我需要在验证有效负载之前做一些预处理。我有一个自定义验证器,它需要模型中的两个值来执行验证。其中一个值在路径中,所以我想从路径中在模型上设置这个值,然后进行验证。
我不想关闭所有操作的功能:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<ApiBehaviorOptions>(options =>
{
options.SuppressModelStateInvalidFilter = true;
});
}
有什么办法我可以关掉它只是为了一个单独的行动吗?
编辑:
我试图修改InvalidModelStateResponseFactory,但是它没有解决我的问题,因为我仍然需要进入控制器操作:
services.Configure<ApiBehaviorOptions>(options =>
{
options.InvalidModelStateResponseFactory = actionContext =>
{
var ignore = actionContext.ActionDescriptor.FilterDescriptors.Any(fd => fd.Filter is SuppressModelStateInvalidFilterAttribute);
if (ignore)
{
// Can only return IActionResult so doesn't enter the controller action.
}
return new BadRequestObjectResult(actionContext.ModelState);
};
});
[AttributeUsage(AttributeTargets.Method)]
public class SuppressModelStateInvalidFilterAttribute : FormatFilterAttribute
{
}
编辑:
以下是我在asp.net核心回购中提出的一个问题的链接,以防我在这方面有所进展-- https://github.com/aspnet/Mvc/issues/8575
发布于 2018-10-09 11:14:33
这可能通过为您的具体情况实现自己的验证器来解决。文档中很好地涵盖了这一问题。
这或者可能是一个定制的模型绑定器,用于在验证之前使用所有预处理来创建模型。
发布于 2019-05-28 22:27:51
更新:您只需在Startup.cs中的ConfigureServices中使用以下代码:
services.Configure<ApiBehaviorOptions>(apiBehaviorOptions => {
apiBehaviorOptions.SuppressModelStateInvalidFilter = true;
});
根据Simon的回答,我不得不修改ASP.Net Core2.2的属性如下:
/// <summary>
/// Suppresses the default ApiController behaviour of automatically creating error 400 responses
/// </summary>
[AttributeUsage(AttributeTargets.Method)]
public class SuppressModelStateInvalidFilterAttribute : Attribute, IActionModelConvention {
private static readonly Type ModelStateInvalidFilterFactory = typeof(ModelStateInvalidFilter).Assembly.GetType("Microsoft.AspNetCore.Mvc.Infrastructure.ModelStateInvalidFilterFactory");
public void Apply(ActionModel action) {
for (var i = 0; i < action.Filters.Count; i++) {
if (action.Filters[i] is ModelStateInvalidFilter || action.Filters[i].GetType() == ModelStateInvalidFilterFactory) {
action.Filters.RemoveAt(i);
break;
}
}
}
}
发布于 2018-10-10 14:28:40
我收到了Microsoft - https://github.com/aspnet/Mvc/issues/8575的回复。
下面这句话很有魅力。
[AttributeUsage(AttributeTargets.Method)]
public class SuppressModelStateInvalidFilterAttribute : Attribute, IActionModelConvention
{
public void Apply(ActionModel action)
{
for (var i = 0; i < action.Filters.Count; i++)
{
if (action.Filters[i] is ModelStateInvalidFilter)
{
action.Filters.RemoveAt(i);
break;
}
}
}
}
在我的控制器中,在重新验证模型之前,我可以对模型进行更改(注意ModelState.Clear(),TryValidateModel添加到现有的模型状态):
if (model == null)
{
return BadRequest(ModelState);
}
model.Property = valueFromPath;
ModelState.Clear();
if (TryValidateModel(model) == false)
{
return BadRequest(ModelState);
}
https://stackoverflow.com/questions/52719558
复制相似问题