【发布时间】:2010-12-23 18:02:55
【问题描述】:
我是 asp.net 的新手,但遇到了问题。当用户在编辑器中为十进制字段插入数字以外的内容时,他们会收到错误“字段名称”不是数字。但我不希望他们收到这条消息,我希望他们收到另一条消息。对于 required 和 range 验证器,我对此没有任何问题。 我有什么办法可以做到这一点?
我并不是说仅仅显示另一条信息就必须改变文化。
谢谢。
【问题讨论】:
-
在此处发布您的验证属性以供参考
我是 asp.net 的新手,但遇到了问题。当用户在编辑器中为十进制字段插入数字以外的内容时,他们会收到错误“字段名称”不是数字。但我不希望他们收到这条消息,我希望他们收到另一条消息。对于 required 和 range 验证器,我对此没有任何问题。 我有什么办法可以做到这一点?
我并不是说仅仅显示另一条信息就必须改变文化。
谢谢。
【问题讨论】:
希望我理解你,改变RangeValidatorErrorMessage只需初始化ErrorMessage参数:
[Range(0, 100, ErrorMessage = "Some another error message insert here!")]
[RegularExpression("\d", ErrorMessage = "!!!")]
public decimal DecimalField { get; set; }
【讨论】:
这是真正的答案:
创建一个类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:
【讨论】:
不幸的是,这不是一项简单的任务。但是,您可以尝试以下技巧... 最好只在基本字段上执行此操作,因为这样需要维护更多代码。
在控制器的action方法中
if(ModelState.IsValid)
{
// code
}
else
{
if (ModelState["YourField"].Errors.Count > 0)
{
ModelState["YourField"].Errors.Clear();
ModelState.AddModelError("YourField", "Your custom message here");
}
// code
}
【讨论】:
您可以将 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?
【讨论】:
要更改服务器端验证后收到的错误消息,您需要更改资源文件中的“PropertyValueInvalid”键并将资源文件名分配给DefaultModelBinder.ResourceClassKey。详情见这个问题:localize default model validation in mvc 2
【讨论】:
在本页末尾寻找解决方案:
我在我的 MVC 3 RTM 项目中检查了这个,它运行良好。
【讨论】:
【讨论】:
【讨论】:
似乎自从 Para 的答案 MVC 演变以来,现在 ClientDataTypeModelValidatorProvider 接受了 ResourceClassKey 属性。它使用资源类中指定的 FieldMustBeNumeric 和 FieldMustBeNumeric 消息。
【讨论】:
自定义 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; }
【讨论】: