asp.net mvc验证必须是一个数字自定义错误

时间:2010-12-23 18:02:55

标签: asp.net-mvc validation

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

我并没有提到改变文化只是显示另一条消息。

感谢。

10 个答案:

答案 0 :(得分:13)

希望我理解您,更改RangeValidator ErrorMessage只需初始化ErrorMessage参数:

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

答案 1 :(得分:6)

这是实际答案:

创建一个班级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获得了这个想法:

答案 2 :(得分:2)

不幸的是,这不是一项微不足道的任务。但是你可以尝试以下hack ... 最好只在基本字段上执行此操作,因为这是需要维护的更多代码。

在控制器的动作方法

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

  // code
}

答案 3 :(得分:2)

您可以将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?

答案 4 :(得分:1)

要更改服务器端验证后获得的错误消息,您需要更改资源文件中的“PropertyValueInvalid”键,并将资源文件名分配给DefaultModelBinder.ResourceClassKey。有关详细信息,请参阅此问题:localize default model validation in mvc 2

答案 5 :(得分:1)

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

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

我在我的MVC 3 RTM项目中检查过它,效果很好。

答案 6 :(得分:1)

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

一种用于自定义 RangeValidator 的快速,简单的技巧 ErrorMessage -““字段名称”不是数字”-使用正则表达式

[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; }