阻止 ASP.NET MVC 发出数据价值编号验证



我的(视图(模型有一个账单利率字段,显示例如"$123.00">

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

由于 ApplyFormatInEditMode=true,这会显示一个"$"符号,因此它不是有效的小数,并且当我跳出文本框时(客户端(验证失败。

我通过添加自己的自定义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-decimalsymbols属性外,发出的 HTML 仍然具有data-val-number属性:

<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,无论如何它都被放置了。 谢谢!

>DataFormatString = "{0:c}"使您的值恢复为前面带有 $ 的货币值。您可以告诉 MVC 不要附加该验证器的一种方法是创建自己的扩展方法来生成HtmlString

或者,使用 ApplyFormatInEditMode = false 在编辑模式下不将 $ 放在字符串中。

最新更新