Asp.net mvc 4 MVC WebAPI数据批注错误消息空字符串

Asp.net mvc 4 MVC WebAPI数据批注错误消息空字符串,asp.net-mvc-4,asp.net-web-api,owin,Asp.net Mvc 4,Asp.net Web Api,Owin,我已经实现了一个OWIN自托管webapi,并尝试使用数据注释和ActionFilterAttribute将格式化错误返回给用户。我已经在数据注释上设置了自定义错误消息,但是当我尝试从ModelState检索消息时,它总是一个空字符串(如下图所示) 型号: public class JobPointer { [Required(ErrorMessage = "JobId Required")] public Guid JobId { get; set; } } 过滤器: pu

我已经实现了一个OWIN自托管webapi,并尝试使用数据注释和ActionFilterAttribute将格式化错误返回给用户。我已经在数据注释上设置了自定义错误消息,但是当我尝试从ModelState检索消息时,它总是一个空字符串(如下图所示)

型号:

public class JobPointer
{
    [Required(ErrorMessage = "JobId Required")]
    public Guid JobId { get; set; }
}
过滤器:

public class ModelValidationFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (actionContext.ModelState.IsValid) return;
        string errors = actionContext.ModelState.SelectMany(state => state.Value.Errors).Aggregate("", (current, error) => current + (error.ErrorMessage + ". "));

        actionContext.Response = actionContext.Request.CreateErrorResponse(
            HttpStatusCode.BadRequest, errors);
    }

}
终点:

[HttpPost]
public HttpResponseMessage DescribeJob(JobPointer jobId)
{

   Job job = _jobhelper.GetJob(jobId.JobId);
   return Request.CreateResponse(HttpStatusCode.OK, job);
}
请求机构:

{

}
答复:

Status Code: 400
{
  "Message": ". "
}
如果我将ModelValidationFilter中的error.Message更改为error.Exception.Message,我将返回默认的验证错误:

Status Code: 400
{
  "Message": "Required property 'JobId' not found in JSON. Path '', line 3, position 2.. "
}

我知道这是一个老问题,但我只是遇到了这个问题,自己找到了解决办法

毫无疑问,正如您所发现的,As-Guid是一种不可为null的类型[Required]会生成一条不友好的错误消息(我假设是因为JSON解析器在实际获得模型验证之前就已经获取了该消息)

您可以通过使Guid为空来解决此问题

公共类作业指针
{
[必需(ErrorMessage=“JobId Required”)]
公共Guid?作业ID{get;set;}
}
。。。然而,这并不是在所有情况下都可行的选项(就像我的情况一样),所以我最终编写了自己的验证属性,它将根据属性的空声明检查属性

public class IsNotEmptyAttribute : ValidationAttribute
{

    public override bool IsValid(object value)
    {

        if (value == null) return false;

        var valueType = value.GetType();
        var emptyField = valueType.GetField("Empty");

        if (emptyField == null) return true;

        var emptyValue = emptyField.GetValue(null);

        return !value.Equals(emptyValue);

    }
}
然后你可以像这样实现

公共类作业指针
{
[IsNotEmpty(ErrorMessage=“JobId Required”)]
公共Guid作业ID{get;set;}
}

能否添加API调用和完整响应详细信息?您是否收到一个400错误请求,但响应为空。小快照显示jobid的JSON异常。。请尝试使该字段为空(Guid?),然后重试。无论如何,请提供更多细节。控制器操作方法,可能是fiddler请求/响应。我正在发送一个空白json块,我将为被调用的端点添加代码。我正确地收到了400个错误请求,并且我可以正确地返回异常消息,该消息声明“未找到必需的属性'JobId'”,但我想返回我的自定义消息。您是否找到了此问题的解决方案?