Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 当模型的fluentvalidation在ASP.NETCore中无效时,为什么我的控制器被击中?_Asp.net Core_Fluentvalidation - Fatal编程技术网

Asp.net core 当模型的fluentvalidation在ASP.NETCore中无效时,为什么我的控制器被击中?

Asp.net core 当模型的fluentvalidation在ASP.NETCore中无效时,为什么我的控制器被击中?,asp.net-core,fluentvalidation,Asp.net Core,Fluentvalidation,我相信我在按照文件做每件事。我已在Startup.cs类中设置了fluent验证: public void ConfigureServices(IServiceCollection services) { services.AddSwaggerGen(swagger => { swagger.SwaggerDoc("v1", new OpenApiInfo {

我相信我在按照文件做每件事。我已在Startup.cs类中设置了fluent验证:

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddSwaggerGen(swagger =>
            {
                swagger.SwaggerDoc("v1", new OpenApiInfo { Title = _swaggerApiName });
                swagger.DescribeAllParametersInCamelCase();
            });

            services.AddMvcCore()
                .AddJsonOptions(options =>
                {
                    options.JsonSerializerOptions.IgnoreNullValues = false;
                })
                .AddFluentValidation(options =>
                {                    
                    options.RunDefaultMvcValidationAfterFluentValidationExecutes = false;
                    options.RegisterValidatorsFromAssemblyContaining(typeof(ContentCoreMarker));
                    options.ImplicitlyValidateChildProperties = true;
                })
               .AddApiExplorer()
               .AddRazorViewEngine();
        }
我的简单验证器。请注意,RuleFor上有一个断点

    public class AddSectionRequestValidator : AbstractValidator<AddSectionRequest>
    {
        public AddSectionRequestValidator()
        {
            RuleFor(m => m.SectionName)
                .NotEmpty()
                .MinimumLength(1)
                .WithMessage("invalid");

            RuleFor(m => m.ParentSectionId)
                .NotEmpty();
        }
    }
public类AddSectionRequestValidator:AbstractValidator:

如果要禁用此行为以便FluentValidation是唯一执行的验证库,则可以在应用程序启动例程中将RunDefaultMvcValidationAfterFluentValidationExecutes设置为false

控制器中的断点仍被命中。我还创建了验证器的本地副本以进行测试,结果是模型无效

        [HttpPost]
        public async Task<IActionResult> Post([FromBody]AddSectionRequest request)
        {
            var validator = new AddSectionRequestValidator();
            var isValid = validator.Validate(request); // Not valid

            var result = await _addSectionRequestHandler.Handle(request);
            return Ok(result.NewSectionId);
        }
[HttpPost]
公共异步任务发布([FromBody]AddSectionRequest)
{
var validator=new AddSectionRequestValidator();
var isValid=validator.Validate(请求);//无效
var result=await\u addSectionRequestHandler.Handle(请求);
返回Ok(result.NewSectionId);
}

我在ASP.Net Core 3.1上,您的控制器被击中,因为您应该在那里处理验证。在控制器中使用验证程序的示例如下:

    [ApiController] // <-- Fix is here
    [Route("[controller]")]
    public class SectionController : ControllerBase
    {

        [HttpPost]
        public async Task<IActionResult> Post([FromBody] DtoArticle request)
        {
            var ms = ModelState;
            if (!ms.IsValid)
                throw new Exception("Should not be possible");

            return Ok();
        }
    }
配置FluentValidation后,ASP.NET将使用启动例程中配置的验证程序映射自动验证传入请求

[HttpPost]
公共IActionResult创建(个人){
如果(!ModelState.IsValid){//验证失败时重新呈现视图。
返回视图(“创建”,人员);
}
Save(person);//将此人保存到数据库或其他逻辑中
TempData[“通知”]=“成功创建人员”;
返回操作(“索引”);
}
如您所见,他们检查
ModelState
是否有效,然后返回带有
Person
模型的视图

由于您没有返回视图,我建议您尝试返回ModelState:

[HttpPost]
公共异步任务发布([FromBody]AddSectionRequest)
{
如果(!ModelState.IsValid)返回BadRequest(ModelState);
var result=await\u addSectionRequestHandler.Handle(请求);
返回Ok(result.NewSectionId);
}
这将返回如下所示的json:

{
“名称”:[“名称字段是必需的。”]
}

我还发现了更详细的内容,并封装了模型验证,以便为每个控制器操作启用它。

最终发现了问题。我的问题是,我的控制器顶部缺少[ApiController]属性:

    [ApiController] // <-- Fix is here
    [Route("[controller]")]
    public class SectionController : ControllerBase
    {

        [HttpPost]
        public async Task<IActionResult> Post([FromBody] DtoArticle request)
        {
            var ms = ModelState;
            if (!ms.IsValid)
                throw new Exception("Should not be possible");

            return Ok();
        }
    }