我已经通过指定DefaultModelBinder.ResourceClassKey
阅读answers有关验证错误的本地化的信息,基本上是在int字段中输入字符串值,而不是在datetime字段中输入日期时间。
但是当我为int字段输入“111111111111111111111111111111”时,我得到System.OverflowException
,它看起来像"The value '{0}' is invalid."
。
是否有办法以类似于其他MVC验证的方式本地化(将该消息转换为其他语言)验证错误?
答案 0 :(得分:3)
我有同样的问题,我终于找到了解决方案。是的,该消息可以进行本地化,幸运的是,当您弄清楚时,这很容易。
您必须创建一个资源文件并将其放在App_GlobalResources
文件夹中。您可以随意调用该文件,但我通常将其称为MvcValidationMessages。
打开资源文件并创建一个名为InvalidPropertyValue
的字符串,并在值字段中写下您想要的任何消息。
现在,打开Global.asax文件并将以下行添加到方法Application_Start()
:
System.Web.Mvc.Html.ValidationExtensions.ResourceClassKey = "MvcValidationMessages";
“MvcValidationMessages”当然应该是您刚刚创建的资源文件的正确名称。
哇哇!这里的所有都是它的。显示的消息现在将是您自己的消息,而不是默认消息。
答案 1 :(得分:0)
我最终覆盖了int
的ModelBinder并在那里提供了本地化的错误消息:
public class IntModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
double parsedValue;
if (double.TryParse(value.AttemptedValue, out parsedValue))
{
if ((parsedValue < int.MinValue || parsedValue > int.MaxValue))
{
var error = "LOCALIZED ERROR MESSAGE FOR FIELD '{0}' HERE!!!";
bindingContext.ModelState.AddModelError(bindingContext.ModelName, string.Format(error, value.AttemptedValue, bindingContext.ModelMetadata.DisplayName));
}
}
return base.BindModel(controllerContext, bindingContext);
}
}
然后我只是注册了它:ModelBinders.Binders.Add(typeof(int), new IntModelBinder());
它现在工作正常。
P.S。当然,我的本地化错误消息在模型绑定器中没有硬编码,这只是一个简化的例子:)