gpt4 book ai didi

c# - WebAPI OData 验证失败 未返回 ModelState 对象

转载 作者:太空狗 更新时间:2023-10-29 19:47:55 25 4
gpt4 key购买 nike

我正在创建一个 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":""
}
}
}

我的发布方法如下所示:

 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-and-visual-studio-2012/aspnet-and-web-tools-20122-release-notes

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

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

最佳答案

OData 使用 ODataError作为错误响应。 ODataError之间的区别和 HttpEror是 HttpError 派生自 Dictionary<string, object>所以当它被 ModelStateDictionary 激活时,所有模型错误都设置为 ModelState属性(property)。但是,当您请求 OData 时,HttpError对象映射到 ODataError所有验证错误都连接到 InnterError属性(property)。

关于c# - WebAPI OData 验证失败 未返回 ModelState 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23443976/

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