Asp.net mvc ASP.NET MVC自定义特定数值属性(DataAnnotations?)的错误消息

Asp.net mvc ASP.NET MVC自定义特定数值属性(DataAnnotations?)的错误消息,asp.net-mvc,data-annotations,Asp.net Mvc,Data Annotations,我有一个OrderNumber模型属性,类型为double?我想更改默认值“值'abc'对订单号无效”。输入字母数字(或其他无效)数据时生成错误消息,但我只想对模型对象中的订单号属性执行此操作。我尝试过使用regex数据注释,但这只适用于客户端验证(关于自定义错误消息),因为在服务器端,在regex注释生效之前,基本属性数据类型(不是双精度?)上的数据失败。对于某些表单,我们有很多输入对象,因此我们必须禁用客户端脚本,因为它会导致速度问题,另外一些客户端将禁用脚本,因此我们需要在服务器端使用此自

我有一个OrderNumber模型属性,类型为double?我想更改默认值“值'abc'对订单号无效”。输入字母数字(或其他无效)数据时生成错误消息,但我只想对模型对象中的订单号属性执行此操作。我尝试过使用regex数据注释,但这只适用于客户端验证(关于自定义错误消息),因为在服务器端,在regex注释生效之前,基本属性数据类型(不是双精度?)上的数据失败。对于某些表单,我们有很多输入对象,因此我们必须禁用客户端脚本,因为它会导致速度问题,另外一些客户端将禁用脚本,因此我们需要在服务器端使用此自定义错误消息。如果输入的数据类型不正确,如何设置自定义错误消息


这还需要与本地化兼容(例如,我的显示标签注释是[display(ResourceType=typeof(Localization.Resources),Name=“OrderNumberLabel”))

这可以通过设置DefaultModelBinder ResourceClassKey属性来实现

在应用程序下创建“App_GlobalResources”文件夹并添加资源文件。(将其命名为“MyResource.resx”)

现在添加一个键“PropertyValueInvalid”并分配errorTemplate(例如属性{1}的“无效内容{0}”)

看起来应该是

现在在global.asax的“Application_Start”中添加以下行

DefaultModelBinder.ResourceClassKey = "MyResource";
现在您将看到定制错误。(对于非JS)


您不能为此派生自己的验证器类吗?在那里,你甚至可以处理客户端验证(在需要的时候)。这就是我真正想要的——问题是,理想情况下,我希望它保持双重身份?类型属性,否则它几乎使验证变得毫无意义-我看到过将其设置为字符串,然后再次验证并转换为双精度的建议?在控制器中,但这似乎不是一个好主意-问题是输入数据到属性类型的转换似乎首先起作用,这是我的问题。我想这只是一个观点,但问题可能是:它是“双重”类型吗?毕竟你是在为用户界面建模,所以你在谈论用户。如果他们理解空字段是什么,当它有一个值时,它是一个浮点数,那么我认为答案是“是的,保持它为双精度?”并执行您可能需要执行的任何操作。在某些情况下,用户没有线索,因此需要自定义错误消息。它是双重类型,所以它映射到我们系统中的数据库列,它可以为null,因为它是可选的搜索字段。我强烈地输入了它,因为它使生活变得更简单,而且我认为更安全-然后框架验证输入的类型,我可以在数据注释中输入最小/最大值以进行范围验证,我不必手动转换它(因此,编写“辅助”验证代码,以防它以文本值的形式通过),当它被用于搜索时,有各种各样的优势。那么,把它作为双倍?并派生您自己的验证类(如果标准类不符合您的需要)。我认为一致性是一个很好的目标,只要有可能,它会使您免于可怕的头痛…问题是,它会影响每个错误消息,而不仅仅是指定属性的错误消息-在订单行字段上显示“订单号无效,请仅输入订单号”消息没有多大意义。我确实在上面提到过这一点,或者有没有一种方法可以只针对特定的指定属性执行此操作?那么唯一的方法就是在模型中将其声明为字符串,对数字[\d]+进行正则表达式检查,然后可以指定所需的错误消息。PropertyValueInvalid主要用于数字类型。我希望避免因为数据会增加不必要的额外复杂度和代码/属性而不得不强制键入数据-我已经尝试过将属性更改为OrderNumberText,用正则表达式验证它,然后将get-only属性OrderNumber作为双精度?返回一个值(因此我不需要修改太多代码,只需要原始OrderNumber的输入视图字段)——这仍然将其保留在模型对象中,但仍然有点混乱