【问题标题】:Returning an error response in the case of a null model在 null 模型的情况下返回错误响应
【发布时间】:2013-08-28 21:11:42
【问题描述】:

在我的 ASP.NET MVC API 应用程序中,如果缺少一些 Required 字段,我可以返回有用的 ErrorResponse

return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);

-

"Message": "The request is invalid.",
        "ModelState": {
            "myModel.FooA": [
                "The FooA is required."
            ],
            "myModel.FooC": [
                "The FooC property is required."
            ],
            "myModel.FooD": [
                "The FooD property is required."
            ]
        }

但是,正如 this answer 所确认的,NULL 模型验证。由于我不允许这样做,我如何返回同样有用的错误响应,说明 all 所需的值?我知道我可以为每个属性手动添加一个 ModelError,但我怀疑CreateErrorResponse 可以为我执行此操作。

【问题讨论】:

  • 嗨@Jonathan。上面的参考有一个检查模型是否不为空。如果它为空,您可以查看以下建议。
  • 如果您的对象为空,您可以致电Controller.ValidateModel(new MyClass()) 吗? (注意,ValidateModelController 类的一个方法)。见stackoverflow.com/questions/6360087/…
  • 没有自动的方法来实现你想要的。您需要自定义模型绑定器
  • 如果ModelState.IsValid() 在空值上测试false,那么当页面加载时,即使在用户开始输入表单之前,您也会立即遇到错误。实际上是早期验证框架中的常见问题。

标签: asp.net-mvc asp.net-mvc-3


【解决方案1】:

您使用的是 mvc3 还是 web-api?您的标签表明您正在使用 mvc,但您的开场白暗示了 web-api。如果使用 mvc3,您可以使用以下内容:

在您调用 ModelState.IsValid 之前在您的控制器中添加:

if (modelObj == null)
{
    ModelState.Clear();
    var blankModel = new MyClass();
    TryValidateModel(blankModel);
    return View("About", blankModel);        
}

如果您使用 web-api 并且假设您使用的是System.ComponentModel.DataAnnotations,则可以使用以下内容:

ModelState.Clear();

var model = new MyClass();
var results = new List<ValidationResult>();
Validator.TryValidateObject(model, new ValidationContext(model, null, null), 
                                                                 results, true);

var modelState = new ModelStateDictionary();
foreach (var validationResult in results)
    modelState.AddModelError(validationResult.MemberNames.ToArray()[0],
                                                 validationResult.ErrorMessage);

return Request.CreateErrorResponse(HttpStatusCode.BadRequest, modelState);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    相关资源
    最近更新 更多