MVC3不显眼的jquery验证数据-val-number

时间:2012-03-13 14:01:46

标签: jquery asp.net-mvc-3 html5 unobtrusive-javascript

真正挣扎于MVC3设置的内置不引人注目的jquery验证。

我的对象有一个属性:

    [DisplayName("GP")]
    [DataType(DataType.Currency)]
    [DisplayFormat(NullDisplayText = "$0", DataFormatString = "{0:C0}", ApplyFormatInEditMode = true)]
    [Column("gross_profit")]
    public decimal? GrossProfit { get; set; }

EditorFor创建一个文本框,这很好,但验证失败,因为我希望用户能够输入货币前缀...例如$ 48,000 ..客户端验证失败,说该属性不是数字。

我编写自己的数据注释和自定义模型绑定没有问题,但我无法弄清楚如何阻止MVC自动将“data-val-number”放入文本输入只是因为它是十进制类型。

我认为“data-val-number”正在阻止jquery不引人注意的传递验证,因为输入字段包含一个美元符号,可能还有一个逗号。

所以我不是在寻找任何全球化的提示,而是一种允许用户输入“$ 48,000”这样的文字并且通过验证的方法......

我也想对百分比值采用相同的方法......例如“25%”

1 个答案:

答案 0 :(得分:1)

您不希望在decimal?属性中使用非数字值进行显示。有几种方法可以解决这个问题,但MVC中的默认模型绑定器总是尝试将######。##显式映射到十进制字段。如果您有辅助输入,例如$ ##,###。##它会爆炸,因为它不能直接转换为十进制值。

你有2个解决方案,第一个是使用输入掩码,如:

http://www.xaprb.com/html-input-mask/html-form-input-mask.html

http://digitalbush.com/projects/masked-input-plugin/

仅调整输入的UI显示。

或者您可以在模型中使用与字符串数据类型相同的逻辑。

[DisplayName("GP")]
[DataType(DataType.Currency)]
[DisplayFormat(NullDisplayText = "$0", DataFormatString = "{0:C0}", ApplyFormatInEditMode = true)]
[Column("gross_profit")]
public string CurrencyDisplay { get; set; }

public decimal? CurrencyInput 
{
    get
    {
        //parse out non-int fields to return from value in CurrencyDisplay
    }

    set
    {
        //format string and seed into CurrencyDisplay
    }
}