WebAPI OData验证失败,ModelState对象未返回

本文关键字:对象 返回 ModelState OData 验证 失败 WebAPI | 更新日期: 2023-09-27 18:01:33

我正在创建一个AngularJS web表单,使用WebAPI设置作为OData执行POST(插入)到表中。我试图找回一个失败的验证ModelState对象(JSON格式),以验证表单上的适当字段。

所有我得到的是一个字符串的所有细节作为一个字符串(不是在JSON可解析格式)

{
  "odata.error":{
    "code":"","message":{
      "lang":"en-US","value":"The request is invalid."
    },"innererror":{
      "message":"application.ApplicationName : The ApplicationName field is required.'r'n","type":"","stacktrace":""
    }
  }
}

我的post方法是这样的:

 public async Task<IHttpActionResult> Post(Application application)
        {
           if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }
            db.Applications.Add(application);
            await db.SaveChangesAsync();
            return Created(application);
        }

我甚至尝试将其抽象为ActionFilterAttribute,但仍然是相同的结果

public class ValidateModelAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            if (actionContext.ModelState.IsValid == false)
            {
                var modelState = actionContext.ModelState;
                if (!modelState.IsValid)
                    actionContext.Response = actionContext.Request
                         .CreateErrorResponse(HttpStatusCode.BadRequest, modelState);
            }
        }
    }

我的WebApi启动方法有如下配置:

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
               name: "DefaultApi",
               routeTemplate: "api/{controller}/{id}",
               defaults: new { id = RouteParameter.Optional }
            );
            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
            builder.EntitySet<Application>("DataApplications");
            config.Routes.MapODataRoute("odata", "odata", builder.GetEdmModel());

            config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Include };
            Configure(config);
            config.EnableQuerySupport();
            // Use camel case for JSON data.
            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

这就是我想要实现的(与上面的例子不匹配):

{
    "Message": "The request is invalid.",
    "ModelState": { 
        "car": [
            "Required property 'Make' not found in JSON. Path '', line 1, position 57."
        ],
        "car.Make" : [
            "The Make field is required."
        ], 
        "car.Price": [
            "The field Price must be between 0 and 200000."
        ]
    }
}

我需要ModelState返回,这样我就可以针对适当的字段进行验证反馈。

有什么想法,我可以检查/更改,以得到这个工作所需的?

谢谢。

更新1 -在asp.net

http://www.asp.net/aspnet/overview/aspnet -和- visual studio 2012/aspnet -和- web -工具- 20122 -释放-指出

OData错误响应不包含模型状态错误

当使用CreateErrorResponse扩展方法或HttpErrors直接创建错误响应时,错误被映射到OData错误响应。错误响应中的任何模型状态错误都不会传播到OData错误响应。要保留OData错误响应中的模型状态错误,请直接使用CreateODataErrorResponse扩展方法或ODataError,并将模型状态错误的描述添加到OData错误消息中。

WebAPI OData验证失败,ModelState对象未返回

OData使用ODataError作为错误响应。ODataErrorHttpEror之间的区别在于,HttpError派生自Dictionary<string, object>,因此当它与ModelStateDictionary建立时,所有模型错误都设置为ModelState属性。但是,当您请求OData时,HttpError对象被映射到ODataError,并且所有验证错误都连接到InnterError属性中。