gpt4 book ai didi

asp.net-core - 如何让 "One or more validation errors occurred"引发异常?

转载 作者:行者123 更新时间:2023-12-04 12:37:42 30 4
gpt4 key购买 nike

我在 Core 3.1 上运行 WebAPI,我的一个端点除了 JSON 之外,其模型的字段为 [Required]属性如下:

public class Vendor
{
public int ID { get; set; }
[Required(ErrorMessage = "UID is required")] <<<------ required attribute
public string UID { get; set; }
}
当我在不设置 UID 的情况下调用此端点时,我会按预期获得以下输出:
{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "|7ced8b82-4aa34d65daa99a12.",
"errors": {
"Vendor.UID": [
"UID is required"
]
}
}
尽管这个输出信息量很大,而且很明显它与我的 API 通过 ExceptionFilter 产生的其他错误输出不一致。有什么办法可以将此错误也路由到异常过滤器吗?
这是我的 Startup.cs:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
Common.Configuration = configuration;
}

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
services.AddMvc().AddXmlDataContractSerializerFormatters();
services.AddMvc().AddMvcOptions(options =>
{
options.EnableEndpointRouting = false;
});
services.AddMvcCore(options => options.OutputFormatters.Add(new XmlSerializerOutputFormatter()));
services.AddOptions();
}

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILogger<Startup> logger)
{

//Middleware for exception filtering
app.UseMiddleware<ErrorHandlingMiddleware>(new ErrorHandlingMiddlewareOptions { logger = logger });

app.UseStaticFiles();

app.UseHttpsRedirection();

app.UseRouting();

app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});

app.UseMvc(routes =>
{
routes.MapRoute("EndpointNotFound", "{*url}", new { controller = "Error", action = "EndpointNotFound" });
});
}
}

最佳答案

您可以在 mvc 服务或 Controller 服务中添加过滤器
此过滤器返回 badrequest

services.AddControllers(option =>
{
option.Filters.Add<ValidationFilter>();
});
要创建过滤器,您可以添加此类
您也可以根据需要自定义此过滤器
public class ValidationFilter : IAsyncActionFilter
{
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
//before contrller

if(!context.ModelState.IsValid)
{
var errorsInModelState = context.ModelState
.Where(x => x.Value.Errors.Count > 0)
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value.Errors.Select(x => x.ErrorMessage).ToArray());

var errorResponse = new ErrorResponse();

foreach (var error in errorsInModelState)
{
foreach (var subError in error.Value)
{
var errorModel = new ErrorModel
{
FieldName = error.Key,
Message = subError
};

errorResponse.Error.Add(errorModel);
}

context.Result = new BadRequestObjectResult(errorResponse);
return;
}

await next();

//after controller
}
}
}
我已经像这样创建了错误模型
public class ErrorModel
{
public string FieldName { get; set; }
public string Message { get; set; }
}
和错误响应如下
public class ErrorResponse
{
public List<ErrorModel> Error { get; set; } = new List<ErrorModel>();
public bool Successful { get; set; }
}

关于asp.net-core - 如何让 "One or more validation errors occurred"引发异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62758019/

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