如何禁用模型验证以允许进行流畅的验证检查

问题描述

我有以下控制器:

[Route("api/[controller]")]
public class ReleaseController : BaseController
{
    [HttpPut]
    public Task<ReleaseModel> UpdateAsync([FromBody] UpdateReleaseForm form,CancellationToken cancellationToken = default)
        => _releaseService.UpdateAsync(form,cancellationToken);
}

form和其他属性具有enum属性ReleaseStatus

public class UpdateReleaseForm
{
    // other props omitted for brevity

    public ReleaseStatus Status { get; set; }
}

我使用FluentValidationStatus创建规则:

internal sealed class UpdateReleaseFormValidator : AbstractValidator<UpdateReleaseForm>
{
    public UpdateReleaseFormValidator()
    {
        // other rules omitted for brevity

        RuleFor(u => u.Status)
            .ReleaseStatusValidation();
    }
}

public static class RuleBuildersExtensions
{
    public static IRuleBuilderOptions<T,ReleaseStatus> ReleaseStatusValidation<T>(
        this IRuleBuilder<T,ReleaseStatus> rule)
    {
        return rule.
            IsInEnum()
            .WithMessage(
                string.Format("Status should be one of the following values: `{0}`",string.Join(",",Enum.GetNames(typeof(ReleaseStatus)))));
    }
}

问题是,当错误的Status传递给action方法时,我得到了错误:

{
    "errors": {
        "status": [
            "Error converting value \"WrongStatus\" to type '...ReleaseStatus'. Path 'Status',line 4,position 28."
        ]
    },"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1","title": "One or more validation errors occurred.","status": 400,"traceId": "|3405bc61-4f67bebc131b8dc8."
}

我想改为在验证规则中定义我的自定义消息。

我尝试使用disable-validation中的NullObjectModelValidator

我也尝试过:

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

但是请获取以下内容:

System.ArgumentNullException:无法将空模型传递给Validate。 (参数“ instanceToValidate”)

解决方法

只是一个想法,但是您可以尝试在UpdateAsync方法nullable中创建UpdateReleaseForm表单参数:

[Route("api/[controller]")]
public class ReleaseController : BaseController
{
    [HttpPut]
    public Task<ReleaseModel> UpdateAsync([FromBody] UpdateReleaseForm? form,CancellationToken cancellationToken = default)
        => _releaseService.UpdateAsync(form,cancellationToken);
}

也许允许该参数为空。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...