【问题标题】:asp.net mvc validation must be a number custom errorasp.net mvc验证必须是数字自定义错误
【发布时间】:2010-12-23 18:02:55
【问题描述】:

我是 asp.net 的新手,但遇到了问题。当用户在编辑器中为十进制字段插入数字以外的内容时,他们会收到错误“字段名称”不是数字。但我不希望他们收到这条消息,我希望他们收到另一条消息。对于 required 和 range 验证器,我对此没有任何问题。 我有什么办法可以做到这一点?

我并不是说仅仅显示另一条信息就必须改变文化。

谢谢。

【问题讨论】:

  • 在此处发布您的验证属性以供参考

标签: asp.net-mvc validation


【解决方案1】:

希望我理解你,改变RangeValidatorErrorMessage只需初始化ErrorMessage参数:

[Range(0, 100, ErrorMessage = "Some another error message insert here!")]
[RegularExpression("\d", ErrorMessage = "!!!")]
public decimal DecimalField { get; set; }

【讨论】:

  • 不,我可以修改范围验证器的错误消息,但如果用户在字段中插入“abc”,例如我会收到不同类型的错误消息。例如,如果他输入 101,则会显示这种情况下的范围错误。
  • 我认为正则表达式验证器会对您有所帮助。检查我上面的答案。
  • [DisplayName("Diameter")] [RegularExpression(@"^[0-9,\.]+$", ErrorMessage = "Error msg")] 公共十进制?外径{得到;放; }
【解决方案2】:

这是真正的答案:

创建一个类CustomClientDataTypeModelValidatorProvider。从 MVC 源复制代码。更改方法MakeErrorString 以输出适当的消息,如下所示:

private static string MakeErrorString(string displayName)
{
    return string.Format(
        CultureInfo.CurrentCulture, 
        Core.Resources.Errors.EroareNuENr, 
        displayName);
}

我找不到不复制代码的方法,只是扩展它,因为它使用这种静态方法。 如果有人知道,请告诉我。

然后,在 global.asax 中,我写了这个:

var cdProvider = ModelValidatorProviders.Providers.SingleOrDefault(p => p.GetType().Equals(typeof(ClientDataTypeModelValidatorProvider)));
            if(cdProvider != null)
            {
                ModelValidatorProviders.Providers.Remove(cdProvider);
                ModelValidatorProviders.Providers.Add(
                        new CustomClientDataTypeModelValidatorProvider());
            }

这样流实际上会被路由到我的类而不是 asp.net MVC dll 中的类

我的想法来自here

【讨论】:

    【解决方案3】:

    不幸的是,这不是一项简单的任务。但是,您可以尝试以下技巧... 最好只在基本字段上执行此操作,因为这样需要维护更多代码。

    在控制器的action方法中

    if(ModelState.IsValid)
    {
      // code
    }
    else
    {
      if (ModelState["YourField"].Errors.Count > 0)
      {
        ModelState["YourField"].Errors.Clear(); 
        ModelState.AddModelError("YourField", "Your custom message here");
      }
    
      // code
    }
    

    【讨论】:

      【解决方案4】:

      您可以将 ClientDataTypeModelValidatorProvider 类的 ResourceClassKey 设置为包含 FieldMustBeNumeric 键的全局资源的名称,以用您的自定义消息替换数字的 mvc 验证错误消息。日期验证错误消息的关键也是FieldMustBeDate

      ClientDataTypeModelValidatorProvider.ResourceClassKey="MyResources"; // MyResource is my global resource
      

      有关如何将MyResources.resx 文件添加到您的项目的更多详细信息,请参见此处:

      The field must be a number. How to change this message to another language?

      【讨论】:

        【解决方案5】:

        要更改服务器端验证后收到的错误消息,您需要更改资源文件中的“PropertyValueInvalid”键并将资源文件名分配给DefaultModelBinder.ResourceClassKey。详情见这个问题:localize default model validation in mvc 2

        【讨论】:

          【解决方案6】:

          在本页末尾寻找解决方案:

          http://jwwishart.wordpress.com/2010/03/22/custom-server-and-client-side-required-validator-in-mvc-2-using-jquery-validate/

          我在我的 MVC 3 RTM 项目中检查了这个,它运行良好。

          【讨论】:

          【解决方案7】:

          【讨论】:

          • 我试过了,效果很好。我发现更改 MVC3 源文件更可取
          【解决方案8】:

          您可以实现自己的自定义验证属性:http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx

          【讨论】:

            【解决方案9】:

            似乎自从 Para 的答案 MVC 演变以来,现在 ClientDataTypeModelValidatorProvider 接受了 ResourceClassKey 属性。它使用资源类中指定的 FieldMustBeNumeric 和 FieldMustBeNumeric 消息。

            【讨论】:

              【解决方案10】:

              自定义 RangeValidator ErrorMessage 的快速简单的 hack --"'字段名称'不是数字"-- 正在使用正则表达式

              [Range(0.5, 1000, ErrorMessage = "Amount should be in range {1} to {2}.")]
              [DataType(DataType.Currency)]
              [RegularExpression(@"\d", ErrorMessage = "Amount is not valid.")]
              public decimal Amount{ get; set; }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-06-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多