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

Rob*_*ean 1 c# validation asp.net-mvc modelstate asp.net-web-api

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

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; }
}
Run Code Online (Sandbox Code Playgroud)

那么控制器是:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我正在尝试在创建新雇主之前验证模型。因此,当我传递无效模型时id,响应将如下:

{
  "message": "The request is invalid.",
  "modelState": {
    "employer.Id": [
      "Please specify id."
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

我想检查是否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!"
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*att 5

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

ModelState.AddModelError($"{nameof(employer)}.{nameof(employer.OrganizationId)}", "Error message here");
Run Code Online (Sandbox Code Playgroud)

这并不完全漂亮,但这是你能做的最好的了。