問題は、カスタム エラー メッセージを提供するために .rsx ファイル (リソース) を使用する場合、ApiController でModelState.IsValidが常にtrueになることです。
これが私のモデルです:
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およびEmbedded Resourceビルド アクションとして構成) を使用すると、次のようになります。
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は true です。
Resources クラスが表示され、 resharper はErrorMessageResourceNameで提供される文字列を正しく検証します。