本文介绍了筛选器之后的ASP.NET核心验证的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想为我们的服务中的所有API(ASP.NET核心)运行一些定制逻辑,这些API在模型验证之前但在模型绑定之后。这个是可能的吗?我尝试了一个ActionFilter,但它在验证后被调用。资源筛选器也不适用于我们。感谢您的帮助。
推荐答案
Web API controllers don't have to check ModelState.IsValid,如果它们具有[api控制器]属性。在这种情况下,当模型状态无效时,将返回包含问题详细信息的自动HTTP400响应。
实现您想要的一种方法是抑制此行为。
将以下代码添加到ConfigureServices:
services.Configure<ApiBehaviorOptions>(options =>
{
options.SuppressModelStateInvalidFilter = true;
});
然后您可以将代码添加到筛选器中-例如:
public class SampleActionFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
// do something before the action executes
if(context.ActionArguments != null && context.ActionArguments.Count > 0)
{
//WARNING - you should add "safe" code to access the dictionary
//I have hardcoded the parameter name (data) here for sample only.
var model = context.ActionArguments["data"];
}
}
public void OnActionExecuted(ActionExecutedContext context)
{
// do something after the action executes
}
}
当然,您还需要应用筛选器-在下面的示例中,我已经全局应用了它。如果您愿意,可以说得更具体。services.AddMvc(
options => options.Filters.Add(new SampleActionFilter())
).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
在您的控制器代码中,您还可以根据需要进一步使用TryValiateModel方法,如下所示:
[Route("api/[controller]")]
[ApiController]
public class ProcessController : ControllerBase
{
[HttpPost]
public IActionResult Contact(FormDataModel data)
{
bool validated = TryValidateModel(data);
if (!ModelState.IsValid)
{
ModelState.AddModelError("", "Id cannot be empty..");
return Ok();
}
return Ok();
}
}
希望这有助于解决您的问题。
这篇关于筛选器之后的ASP.NET核心验证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!