模型绑定失败时的自定义响应ASP.NET Core API

时间:2019-07-30 10:25:15

标签: c# .net http asp.net-core-webapi

由于数据类型不匹配而与function indicatorStart(text) { const $loader = $($.parseHTML(`<div id="loader" class="fade show"> <div id="loader-message" role="alert">${text}</div> </div>`)); $('.page-content').append($loader); } function indicatorStop() { $('#loader').remove(); } 的模型绑定失败时,我想给出自定义响应

示例:当有人尝试将我的API中的API绑定到string参数时,我得到以下响应。

GUID

相反,我想说,

处理错误

2 个答案:

答案 0 :(得分:0)

参考此post,要根据您的用例添加自定义响应,请在启动

中添加以下代码
services.Configure<ApiBehaviorOptions>(o =>
{
    o.InvalidModelStateResponseFactory = actionContext =>
        new ResponseObject("403", "processing error");
});

ResponseObject 是自定义类的地方

 class ResponseObject{
   public string Status;
   public string Message;
   ResponseObject(string Status, string Message){
     this.Status = Status;
     this.Message= Message;
   }
 }

当模型绑定失败时,api将返回这样的响应

  

{状态:“ 403”,消息:“处理错误”}

您可以根据需要自定义响应对象。

答案 1 :(得分:0)

尝试使用FormatOutput方法自定义BadRequest响应,如下所示:

 services.AddMvc()
         .ConfigureApiBehaviorOptions(options =>
            {
                options.InvalidModelStateResponseFactory = actionContext =>
                {
                    return new BadRequestObjectResult(FormatOutput(actionContext.ModelState));
                };
            });

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

public List<Base> FormatOutput(ModelStateDictionary input)
    {
        List<Base> baseResult = new List<Base>();
        foreach (var modelStateKey in input.Keys)
        {
            var modelStateVal = input[modelStateKey];
            foreach (ModelError error in modelStateVal.Errors)
            {
                Base basedata = new Base();
                basedata.Status = StatusCodes.Status400BadRequest;
                basedata.Field = modelStateKey; 
                basedata.Message =error.ErrorMessage; // set the message you want 
                baseResult.Add(basedata);
            }
        }
        return baseResult;
    }

 public class Base
{
    public int Status { get; set; }
    public string Field { get; set; }
    public string Message { get; set; }
}