Asp.net core 当模型的fluentvalidation在ASP.NETCore中无效时,为什么我的控制器被击中?
我相信我在按照文件做每件事。我已在Startup.cs类中设置了fluent验证: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 {
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();
}
}