gpt4 book ai didi

asp.net-mvc - 过滤器后的 asp.net 核心验证

转载 作者:行者123 更新时间:2023-12-02 00:20:13 25 4
gpt4 key购买 nike

我想在模型验证之前但在模型绑定(bind)之后为我们服务中的所有 API (asp.net core) 运行一些自定义逻辑。这可能吗?我尝试了一个 ActionFilter,但它在验证后被调用。资源过滤器也不适合我们。感谢您的帮助。

最佳答案

Web API controllers don't have to check ModelState.IsVali d 如果它们具有 [ApiController] 属性。在这种情况下,当模型状态无效时,将返回包含问题详细信息的自动 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);

在您的 Controller 代码中,您还可以根据需要进一步使用 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();
}
}

希望这有助于解决您的问题。

关于asp.net-mvc - 过滤器后的 asp.net 核心验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55733521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com