【问题标题】:Dynamically change validation on browser MVC在浏览器 MVC 上动态更改验证
【发布时间】:2014-05-12 12:41:22
【问题描述】:

我正在实施一个捐赠表格,我有一个带有“金额”字段的Donation 模型:

[Required]
[DataMember(IsRequired = true)]
[Range(36, 10000)]
public decimal Amount { get; set; }

我还在视图中设置了它的验证:

<div class="editor-label">
    @Html.LabelFor(model => model.Payment.Amount)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.Payment.Amount)
    @Html.ValidationMessageFor(model => model.Payment.Amount)
</div>

问题是当用户在网页中选择不同的“货币”时,某些货币的最低金额应该更改。

我尝试做的是更改Input 属性:

$("#Donation_Currency").change(function () {
    var curr = this.value;
    switch (curr) {
        case "USD":
            document.getElementById("Donation_Amount").setAttribute("data-val-range", "The field Amount must be between 36 and 10000.");
            document.getElementById("Donation_Amount").setAttribute("data-val-range-min", "36");
            break;
        case "ILS":
            document.getElementById("Donation_Amount").setAttribute("data-val-range", "The field Amount must be between 100 and 10000.");
            document.getElementById("Donation_Amount").setAttribute("data-val-range-min", "100");
            break;
        default:
    }
});

但即使我看到输入属性发生了变化,我仍然看到旧消息出现。

我肯定做错了,但问题是:

如何根据另一个字段中设置的值更改字段的验证?

【问题讨论】:

  • 您确定消息来自客户端验证吗?可能是输入在客户端验证成功,但是当它到达服务器时,它会返回消息,因为服务器上的范围仍然在 36 到 10000 之间。
  • 嗨@srinivas.naik。当我在开发人员模式下查看输入的属性时,不仅如此,我将其设置为比原来更大的值(100 而不是 36) - 所以服务器上较低的最小值仍然存在。跨度>

标签: asp.net-mvc asp.net-mvc-4 jquery-validate unobtrusive-validation


【解决方案1】:

引用OP:

“但即使我看到输入属性发生了变化,我仍然看到旧消息出现。”

这是因为一旦插件被初始化,你不能简单地通过改变 HTML 属性来改变 jQuery Validate 选项(正如你所了解的)。插件初始化在页面加载时发生一次,以后不会再发生。

初始化后,必须使用插件提供的方法对规则进行动态更改。 See the .rules('add') method 动态添加规则……它也会覆盖之前定义的规则。

试试类似的东西……

$("#Donation_Currency").change(function () {
    var curr = this.value;
    switch (curr) {
        case "USD":
            $("#Donation_Amount").rules('add', {
                range: [36,10000],
                messages: {
                    range: "The field Amount must be between 36 and 10000."
                }
            });
            break;
        case "ILS":
            $("#Donation_Amount").rules('add', {
                range: [100,10000],
                messages: {
                    range: "The field Amount must be between 100 and 10000."
                }
            });
            break;
        default:
    }
});

【讨论】:

  • 感谢您的回复,我尝试这样做,但我收到错误:“Uncaught TypeError: undefined is not a function”在 .role(...) 行(我用户 chrome ) 我不知道为什么,但 .validation() 功能在开发者控制台中也不起作用 - 你有什么想法吗?
  • 我解决了上面注释的错误,现在它正在工作 - 谢谢!
猜你喜欢
  • 2019-01-25
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
相关资源
最近更新 更多