问题是,如果我使用 .rsx 文件(资源)提供自定义错误消息,则在 ApiController ModelState.IsValid中始终为真。
这是我的模型:
public class LoginModel
{
public string Email { get; set; }
[Required]
[MinLength(5)]
public string Password { get; set; }
}
ApiController 中的方法:
[HttpPost]
[ModelValidationFilter]
public void Post(LoginModel model)
{
var a = ModelState.IsValid;
}
和过滤器:
public class ModelValidationFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (actionContext.ModelState.IsValid == false)
{
actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState);
}
}
}
我在 POST 请求中发送这个:
{ Email: "asd@asd.com", Password: "a" }
ModelState.IsValid为false,响应如预期:
{
"Message": "The request is invalid.",
"ModelState":
{
"model.Password":
[
"The field Password must be a string or array type with a minimum length of '5'."
]
}
}
但是,如果我在验证属性中使用资源(配置为公共和嵌入式资源构建操作):
public class LoginModel
{
public string Email { get; set; }
[Required]
[MinLength(5, ErrorMessageResourceName = "Test", ErrorMessageResourceType = typeof(Resources.Localization))]
public string Password { get; set; }
}
(' Test '键只保存' Test '字符串值) ModelState.IsValid为真。
Resources 类是可见的,并且 resharper 正确验证了ErrorMessageResourceName中提供的字符串。