客户端验证和服务器端验证无法协同工作(双打)

时间:2014-10-14 13:53:03

标签: javascript c# asp.net-mvc validation

我有一个带有价格属性的产品类:

[Range(0.01, double.MaxValue, ErrorMessage = "Please enter a positive price")]
public decimal Price { get; set; }

在root webconfig中我有这个元素:

<globalization culture="nl-NL" uiCulture="nl-NL" />

我使用简单的@ Html.EditorForModel()方法为我生成html。

简而言之,如果产品的价格是7欧元和95美分,那么渲染的html将显示7,95而不是7.95。 (注意点(。)和逗号(,)之间的差异)

我有一个编辑控制器负责保存(ms)db的任何产品更新。 仅使用服务器端验证而无需客户端验证,如果我将价格从7,95更改为7,96,则一切都将完美保存。如果我将价格从7,95改为7.96(注意点!),新价格为796,00欧元。但是,可以通过不在价格属性的文本字段中输入点(。)来解决此问题。

但现在麻烦开始了。当我在服务器端验证旁边启用客户端验证并尝试将值7,95更改为7,96时,我收到一条客户端错误消息,指出:“字段价格必须是数字。”它只接受带点(。)的数字(即:7.96),没有带逗号(,)的数字(即:7,96)

这个问题可能有多种解决方案,但我正在寻找的解决方案是我能以某种方式配置“客户端验证器”以接受带逗号的数字(如果可能同时可以配置为使用点来拒绝数字。这样我就不必在每个属性上使用reg-表达式了。)

1 个答案:

答案 0 :(得分:0)

假设您正在使用MVC 3或更高版本,则需要包含&#34;消息&#34;和&#34;方法&#34; MVC使用的jQuery验证插件的语言环境文件。你可以在这里找到它们:

不幸的是,methods_nl.js文件缺少一个与您正在使用的十进制格式匹配的数字验证器。根据{{​​3}} Wiki文章,在荷兰,您使用的格式通常仅用于货币。数字验证器可能因此而未被覆盖,因此您可能需要自己添加一个:

$.extend($.validator.methods, {
    date: function(value, element) {
        return this.optional(element) || /^\d\d?[\.\/\-]\d\d?[\.\/\-]\d\d\d?\d?$/.test(value);
    },
    // Add this:
    number: function(value, element) {
        return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(value);
    }
});

为避免覆盖常规数字格式,您可能希望将其添加为自定义验证方法(使用其他属性名称):

$.extend($.validator.methods, {
    date: function(value, element) {
        return this.optional(element) || /^\d\d?[\.\/\-]\d\d?[\.\/\-]\d\d\d?\d?$/.test(value);
    },
    // Add this:
    currency: function(value, element) {
        return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(value);
    }
});

然后,您必须按照本文所述构建自定义验证类:

在从ModelClientValidationRule派生的类中,您可以将验证类型指定为&#34; currency&#34;。您将注册该子类以将它们粘合在一起。

祝你好运!