[英]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.