我试图在IValidatableObject的上下文中理解客户端和服务器之间的通信。
我有一个ViewModel,其中一个属性CompanyId
,用[Remote("ValidateCompanyId", "Home")]
修饰。
当然,在我的“Home”控制器中,我有ValidateCompanyId操作。
该视图具有CompanyId的文本框。首次显示视图时,我可以在文本框中输入我想要的内容,并且不与服务器进行交互。当文本框失去焦点时,将调用ValidateCompanyId操作。如果验证失败,我会在视图中返回错误消息。到现在为止还挺好。
然而,此时,每次后续击键都会调用服务器。例如,如果我最初键入8500并且出错,如果我想将我的值更改为8200,我看到服务器调用850,然后是85,然后是8,然后是82,然后是820,最后是8200。 / p>
我想我更希望验证调用等待文本框再次失去焦点(就像它最初那样)。特别是,在这种情况下,因为验证需要数据库调用。是什么控制了这个?
答案 0 :(得分:1)
这是默认行为。在字段被标记为无效之前,验证是惰性的,允许您通过控件进行制表,但一旦标记为无效,就会热切地验证(Refer documentation)。您可以使用以下脚本阻止keyup
上的验证
var validator = $("form").data("validator");
if (validator) {
validator.settings.onkeyup = false;
}
注意这会禁用所有控件的keyup
验证。如果你想要它只用于一个控制尝试(未测试)
$(yourSelector).keyup(function() { return false } );