繁体   English   中英

使用正确的键名添加ModelState错误

[英]Add ModelState error with proper key name

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

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!"
    ]
  }
}

我怎样才能添加前缀像的ModelState错误键employer.Id为自己的错误OrganizationId 我应该使用硬编码的employer.OrganizationId还是更好的方法? 如果需要添加模式详细信息,请告诉我。 谢谢。

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

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

它并不完全漂亮,但它是您可以做的最好的事情。

尝试使用远程验证

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

在你的动作看起来像这样

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

您可以为此创建自己的数据属性 ,如果您需要一些自定义名称,但是您实际上并不需要它,则可以将您想要的名称编写为AddModelError ,需要2个字符串(string key, string Message)所以我不要以为真的有什么不同

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM