【问题标题】:Stopping ASP.NET MVC from emitting data-val-number validation停止 ASP.NET MVC 发出 data-val-number 验证
【发布时间】:2013-10-11 23:04:05
【问题描述】:

我的(视图)模型有一个 BillRate 字段,显示例如“$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,不管它是什么都放了。谢谢!

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

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

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

    【讨论】:

    • 我试图通过 $(document).ready(function () { $("input[data-val-decimalsymbols]").each(function () { $(this).removeAttr("data-val-number"); }); });但这并没有帮助。我认为将“$”保持在编辑模式很有吸引力,但不敢相信 ASP.NET 甚至提供 ApplyFormatInEditMode = true,因为它根本不适用于验证。
    猜你喜欢
    • 2011-06-17
    • 2018-10-22
    • 1970-01-01
    • 2012-01-26
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多