【问题标题】:Localization for "the value {0} is invalid" in case of int overflow在 int 溢出的情况下,“值 {0} 无效”的本地化
【发布时间】:2012-06-01 17:04:18
【问题描述】:

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

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

有没有办法以类似于其他 MVC 验证的方式对验证错误进行本地化(将该消息翻译成其他语言)?

【问题讨论】:

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


    【解决方案1】:

    我遇到了同样的问题,我终于设法找到了解决方案。是的,该消息可以本地化,幸运的是,当您弄清楚时,这很容易。

    您必须创建一个资源文件并将其放在App_GlobalResources 文件夹中。您可以随意调用该文件,但我通常将其称为 MvcValidationMessages。

    打开资源文件并创建一个名为InvalidPropertyValue 的字符串,然后在值字段中写入您想要的任何消息。

    现在,打开 Global.asax 文件,将以下行添加到方法 Application_Start()

    System.Web.Mvc.Html.ValidationExtensions.ResourceClassKey = "MvcValidationMessages";  
    

    “MvcValidationMessages”当然应该是你刚刚创建的资源文件的正确名称。

    瞧!这里的所有都是它的。现在显示的消息将是您自己的,而不是默认的。

    【讨论】:

    • 只是为了更响亮地指出它...System.Web.Mvc.Html.ValidationExtensions.ResourceClassKey 是诀窍。谢谢!
    • 这对我不起作用。我正在尝试翻译消息:值 {0} 对 {1} 无效。我真的应该使用 InvalidPropertyValue 键吗?
    • 就我而言,正确的是使用 DefaultModelBinder.ResourceClassKey 代替。 resx 文件中的键是 PropertyValueInvalid。也许,这是由于 MVC 版本。我的是 5.2.7
    【解决方案2】:

    我最终为 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());,它现在可以正常工作了。

    附:当然,我的本地化错误消息没有在模型绑定器中硬编码,这只是一个简化的示例 :)

    【讨论】:

      猜你喜欢
      • 2019-12-26
      • 1970-01-01
      • 1970-01-01
      • 2014-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多