asp.net-mvc - 过滤器后的asp.net核心验证
问题描述
我想在模型验证之前但在模型绑定之后为我们服务中的所有 API(asp.net 核心)运行一些自定义逻辑。这可能吗?我尝试了一个 ActionFilter,但它在验证后被调用。资源过滤器也对我们不起作用。感谢你的帮助。
解决方案
如果 Web API 控制器具有 [ApiController] 属性,则不必检查 ModelState.IsVali d。在这种情况下,当模型状态无效时,将返回包含问题详细信息的自动 HTTP 400 响应。
实现您想要的一种方法是抑制这种行为。
将以下代码添加到 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);
在您的控制器代码中,您还可以根据需要进一步使用 TryValidateModel 方法,如下所示:
[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();
}
}
希望这有助于解决您的问题。
推荐阅读
- java - Thymeleaf 不适用于 lombok forEach
- javascript - Safari 12 css 动画效果不佳
- types - graphQL - 是否可以从单个解析器函数将关系数据解析为不同类型?
- c - Makefile 中未定义对“le16toh”错误的引用
- sql - 跨行累积减法
- android - VS2017 未附加到 Android 上的统一应用程序 - 显示在列表中,选择时没有任何反应
- laravel - 使用模型在 Laravel-admin 中设置上传图片的名称
- c# - 在 UserControls 之间共享数据的最佳实践
- python - Python Pandas If Else 返回多个值 DataFrame 值
- java - NoSuchMethodError 使用 JNA User32 平台映射