阻止ASP.NET MVC发出data-val-number验证

时间:2013-10-11 23:04:06

标签: asp.net-mvc

我的(查看)模型有一个BillRate字段,显示例如“$ 123.00”

    [Display(Name = "Bill Rate")]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:c}")]
    public Decimal BillRate { get; set; }

由于ApplyFormatInEditMode = true,这显示'$'符号,因此它不是有效的Decimal,并且当我从文本框中跳出时,(客户端)验证失败。

我通过添加自己的自定义ValidationAttribute

来解决这个问题
    [DecimalSymbols(ErrorMessage = "Invalid currency")]

其中DecimalSymbols剥离符号,然后解析剩余的数字:

public sealed class DecimalSymbolsAttribute : ValidationAttribute, IClientValidatable
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
         ...
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
         ...
    }
}

这似乎运作良好。但是,除了data-val-number属性:

之外,发出的HTML仍具有data-val-decimalsymbols属性
<input data-val="true" data-val-decimalsymbols="Invalid currency" data-val-number="The field Bill Rate must be a number." id="BillRate" name="BillRate" type="text" value="$82.80" />

data-val-number属性导致jQuery验证失败,因为'$'使字符串不是数字。我不再需要这个属性了,但是我怎么告诉ASP.NET MVC不要把它放进去呢?我尝试过使用EditorFor,TextBoxFor和TextBox,无论如何都要使用它。谢谢!

1 个答案:

答案 0 :(得分:0)

DataFormatString = "{0:c}"正在使您的价值作为具有前面$的货币值返回。您可以告诉MVC不要附加该验证器的一种方法是使用您自己的扩展方法来生成HtmlString

或者,使用ApplyFormatInEditMode = false不要将字符串中的$置于编辑模式中。