不能使用
AdditionalFields
与另一个ViewModel中的值进行比较。原因是规则被添加到
jquery.validate.js
由
jquery.validate.unobtrusive.js
插件(它读取
data-val-*
属性由生成
HtmlHelper
方法)。具体来说是
adapters.add("remote", ["url", "type", "additionalfields"], function (options) {
预挂起的方法
First
属性名称。
一种选择是使用包含所有属性的单一“平面”视图模型。
如果不希望这样做,那么您可以编写自己的Ajax代码来调用执行验证的服务器方法。这实际上也有一些额外的性能优势。默认情况下,初始验证后由
.blur()
事件,对每个
.keyup()
事件,这意味着如果用户最初输入的值无效,您可能会进行大量的Ajax和数据库调用。
移除
[Remote]
属性,并添加以下脚本(我假设属性为
First.ABC
和
Second.XYZ
)
$('#First_ABC').change(function() {
var url = '@Url.Action(...)'; // add your action name
var input = $(this);
var message = $('[data-valmsg-for="First.ABC"]'); // or give the element and id attribute
$.post(url, { abc: input.val(), xyz: $('#Second_XYZ').val() }, function(response) {
var isValid = response === true || response === "true";
if (isValid) {
input.addClass('valid').removeClass('input-validation-error');
message.empty().addClass('field-validation-valid').removeClass('field-validation-error');
} else {
input.addClass('input-validation-error').removeClass('valid');
message.text(response).addClass('field-validation-error').removeClass('field-validation-valid');
}
})
});
控制器方法的位置
[HttpPost]
public ActionResult Validate(string abc, string xyz)
{
bool isValid = .... // code to validate
if (isValid)
{
return Json(true, JsonRequestBehaviour.AllowGet);
}
else
{
return Json("your error message", JsonRequestBehaviour.AllowGet)
}
}