gpt4 book ai didi

c# - 使用具有流畅验证的自定义验证响应

转载 作者:太空狗 更新时间:2023-10-29 20:02:27 24 4
gpt4 key购买 nike

您好,我正在尝试使用 .NET Core 为我的 webApi 获取自定义验证响应。

这里我想要像

这样的响应模型
[{
ErrorCode:
ErrorField:
ErrorMsg:
}]

我有一个验证器类,目前我们只是检查 ModalState.IsValid 是否存在验证错误,并将模型状态对象作为 BadRequest 传递。

但是新要求要求我们为每次验证失败都设置错误代码。

我的示例验证器类

public class TestModelValidator :  AbstractValidator<TestModel>{

public TestModelValidator {
RuleFor(x=> x.Name).NotEmpty().WithErrorCode("1001");
RuleFor(x=> x.Age).NotEmpty().WithErrorCode("1002");
}
}

我可以在我的操作中使用类似的东西来获得验证结果

选项 1:

 var validator = new TestModelValidator();
var result = validator.Validate(inputObj);
var errorList = result.Error;

并将 ValidationResult 操作到我的自定义 Response 对象。或者
选项 2:

I can use [CustomizeValidator] attribute and maybe an Interceptors.

但对于 Opt2,我不知道如何从拦截器检索 ValidationResult 到 Controller 操作。

我只想编写一个通用方法,这样我就可以避免在每个 Controller 操作方法中调用 Opt1 进行验证。

请求指出我正确的资源。

最佳答案

试试这个:

services.Configure<ApiBehaviorOptions>(options =>
{
options.SuppressModelStateInvalidFilter = true;
});

在 ActionFilter 类中构建 BadResquest 响应后,我使用 fluentvalidation 验证模型:

public class ValidateModelStateAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
if (!context.ModelState.IsValid)
{
var errors = context.ModelState.Values.Where(v => v.Errors.Count > 0)
.SelectMany(v => v.Errors)
.Select(v => v.ErrorMessage)
.ToList();

var responseObj = new
{
Message = "Bad Request",
Errors = errors
};

context.Result = new JsonResult(responseObj)
{
StatusCode = 400
};
}
}
}

在 StartUp.cs 中:

        services.AddMvc(options =>
{
options.Filters.Add(typeof(ValidateModelStateAttribute));
})
.AddFluentValidation(fvc => fvc.RegisterValidatorsFromAssemblyContaining<Startup>());

services.Configure<ApiBehaviorOptions>(options =>
{
options.SuppressModelStateInvalidFilter = true;
});

而且效果很好。我希望你觉得它有用

关于c# - 使用具有流畅验证的自定义验证响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45758024/

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