当另一个字段中的值发生变化时,有什么方法可以在一个字段上触发特定的 jquery-unobtrusive 规则?
我有一个表单,上面有两个日期字段(比如开始/结束),验证end
必须大于start
. 这在已经设置end
后更改的简单情况下工作正常。start
它不允许的是:
- 先设置
end
后设置start
start
在两者都已设置后更改,并违反约束
end
服务器端验证当然会捕获它,但是即使在您已经修复后设置错误start
,或者当值end
更改为无效值时也没有显示错误,这看起来很糟糕。触发特定规则的原因是我不想在用户有机会输入值之前在同一字段上触发required
或格式化规则。date
表格从“干净”开始。但是,如果这是不可能的,那么触发所有规则就可以了。
抱歉没有代码示例,但我什至不知道从哪里开始。
更新:
我目前所做的是在模型中挖掘(因为这是一个 asp.net mvc 项目),找到属性,然后直接读取它的属性。
var controllerCtx = ViewContext.Controller.ControllerContext;
var da = ViewData.ModelMetadata.GetValidators(controllerCtx)
.SelectMany(x => x.GetClientValidationRules())
.Where(x => x.ValidationType == "isdateafter")
.FirstOrDefault();
var otherid = da == null ? "" : da.ValidationParameters["propertytested"];
然后在正常的 HTML 部分,我对它进行测试start
,看看它是否是一个日期选择器,然后连接一个基本检查,并触发所有验证规则。由于规则不多,我只是end
在运行之前检查字段中是否有值。我想使用下面的巧妙解决方案,当我这周有一点空闲时间时会尝试一下。
@if (otherid != "") {
<text>
var other = $("#@otherid");
if (other && other.hasClass('hasDatepicker')) { // if the other box is a date/time picker
other.datetimepicker('option', 'onSelect', function(dateText, instance) {
var lowerTime = $(this).datetimepicker('getDate');
$("#@id").datetimepicker('option', 'minDate', new Date(lowerTime.getTime()));
if ($("#@id").val()) { // if there is a value in the other
$('form').data('validator').element('#@id');
}
});
}
</text>
}