在int溢出的情况下,“值{0}的本地化无效”

时间:2012-05-26 11:35:55

标签: asp.net asp.net-mvc-3 localization validation

我已经通过指定DefaultModelBinder.ResourceClassKey阅读answers有关验证错误的本地化的信息,基本上是在int字段中输入字符串值,而不是在datetime字段中输入日期时间。

但是当我为int字段输入“111111111111111111111111111111”时,我得到System.OverflowException,它看起来像"The value '{0}' is invalid."

是否有办法以类似于其他MVC验证的方式本地化(将该消息转换为其他语言)验证错误?

2 个答案:

答案 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。当然,我的本地化错误消息在模型绑定器中没有硬编码,这只是一个简化的例子:)