【问题标题】:Add ModelState error with proper key name使用正确的键名添加 ModelState 错误
【发布时间】:2017-11-02 17:05:58
【问题描述】:

我有一个简单的模型,例如:

public class Employer 
{
    [Required(ErrorMessage = "Please specify id")]
    public int Id { get; set; }

    [MaxLength(256, ErrorMessage = "Max lenght should be less than 256")]
    [Required(ErrorMessage = "Please specify Name")]
    public string Name { get; set; }

    [Required(ErrorMessage = "Please specify id of organization")]
    public int OrganizationId { get; set; }
}

那么控制器是:

public IHttpActionResult Post(Employer employer)
{
    if(!IsActiveOrganization(employer.OrganizationId))
    {
        ModelState.AddModelError(nameof(employer.OrganizationId), "The organization is not active!");
    }
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }
}

如您所见,我正在尝试在创建新雇主之前验证模型。所以,当我通过无效id 的模型时,响应会像:

{
  "message": "The request is invalid.",
  "modelState": {
    "employer.Id": [
      "Please specify id."
    ]
  }
}

我想检查OrganizationId 是否处于活动状态。为此我有一个方法IsActiveOrganization 它检查并返回true/false。如果false 那么我需要添加模型错误并向客户端返回 400 Bad Request。一切正常,但按照我实施的方式,我会得到如下响应:

{
  "message": "The request is invalid.",
  "modelState": {
    "employer.Id": [
      "Please specify id"
    ],
    "OrganizationId": [
      "The organization is not active!"
    ]
  }
}

如何为我自己的错误 OrganizationId 添加前缀到 ModelState 错误键(如 employer.Id)?我应该硬编码employer.OrganizationId 还是有更好的方法?如果我需要添加模式详细信息,请告诉我。谢谢。

【问题讨论】:

  • 以下答案是否解决了您的问题?
  • @MarkC。不,请帮忙

标签: c# asp.net-mvc validation asp.net-web-api modelstate


【解决方案1】:

虽然nameof 非常适合避免硬编码属性名称,但它并非没有缺陷,而且您偶然发现了其中一个主要缺陷:它只返回引用属性的名称,而不是您使用的完整对象图访问它。如果您想避免硬编码,则必须执行以下操作:

ModelState.AddModelError($"{nameof(employer)}.{nameof(employer.OrganizationId)}", "Error message here");

它不是很漂亮,但它是你能做的最好的。

【讨论】:

  • 几乎是一样的ModelState.AddModelError("employer.OrganizationId", "Error message here");我知道属性可以重命名,但在这种情况下不能
  • 嗯,不完全是。对两者都使用nameof,如果employerOrganizationId 的名称发生更改,您仍然会被覆盖,但您仍然需要对两者之间的连接进行硬编码。不过,这是没有办法的。
【解决方案2】:

尝试使用远程验证

    [Remote("Action", "controller" ErrorMessage = "ErrorMsg")]
    [Required(ErrorMessage = "Please specify id of organization")]
    public int OrganizationId { get; set; }

在你的 Action 中看起来像这样

public JsonResult Post(int OrganizationId )
{
    if(!IsActiveOrganization(OrganizationId ))
    {
        return Json(false, JsonRequestBehavior.AllowGet);
    }
    if (!ModelState.IsValid)
    {
        return Json(false, JsonRequestBehavior.AllowGet);
    }
}

【讨论】:

  • 什么是JsonRequestBehavior
  • 请检查这个,就像所有相关信息都可用JsonRequestBehavior
  • 我不需要那个
  • 你需要什么?
【解决方案3】:

您可以为此创建自己的data attribute,如果您想要一些自定义名称,但您并不真的需要这个,您可以写任何您想要的名称为AddModelError,需要2 个字符串,(string key, string Message)所以我不认为它真的有影响

【讨论】:

  • 什么意思?在这里如何帮助属性?
猜你喜欢
  • 2015-07-25
  • 2018-06-21
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 2010-10-27
  • 2011-03-10
相关资源
最近更新 更多