gpt4 book ai didi

c# - 对 ASP.NET Core 中缺少必需属性的响应

转载 作者:行者123 更新时间:2023-12-05 05:09:46 24 4
gpt4 key购买 nike

给定以下 Controller :

using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Mvc;

namespace WebApplication1.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
// POST api/values
[HttpPost]
public ActionResult<string> Post([FromBody] Model req)
{
return $"Your name is {req.Name}";
}
}

public class Model
{
[Required] public string Name { get; set; }
}
}

如果我发布一个空主体 {},响应是:

{
"errors": {
"Name": [
"The Name field is required."
]
},
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "80000002-0002-ff00-b63f-84710c7967bb"
}

我想更改此响应,以便更轻松地自动将错误消息传递给用户。所以我希望它看起来更像这样:

{
"error": 999,
"message": "Field 'name' is required."
}

我尝试像这样扩展 RequiredAttribute 类:

public class MyRequiredAttribute : RequiredAttribute
{
public MyRequiredAttribute()
{
ErrorMessage = "{0} is required";
}
}

遗憾的是,这只会更改集合中返回的字符串,就像这样

{
"errors": {
"Name": [
"Name is required"
]
},
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "80000006-0000-ff00-b63f-84710c7967bb"
}

最佳答案

当使用应用了 ApiController 属性的 Controller 时,ASP.NET Core 会自动处理模型验证错误,方法是返回一个 400 Bad Request 并将 ModelState 作为响应主体。与Automatic HTTP 400 responses有关.您可以像下面这样自定义 BadRequest 响应:

  services.AddMvc()
.ConfigureApiBehaviorOptions(options =>
{
options.InvalidModelStateResponseFactory = actionContext =>
{
var modelState = actionContext.ModelState;
return new BadRequestObjectResult(FormatOutput(modelState));
};
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

根据您的想法自定义 FormatOutput 方法。

public List<Base> FormatOutput(ModelStateDictionary input)
{
List<Base> baseResult = new List<Base>();
foreach (var modelState in input.Values)
{
foreach (ModelError error in modelState.Errors)
{
Base basedata = new Base();
basedata.Error = StatusCodes.Status400BadRequest;
basedata.Message =error.ErrorMessage;
baseResult.Add(basedata);
}
}
return baseResult;
}

public class Base
{
public int Error { get; set; }
public string Message { get; set; }
}

关于c# - 对 ASP.NET Core 中缺少必需属性的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57233662/

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