这个问题在这里已有答案:
我已经使用MVC 3不引人注意的验证实现了远程验证,如下所示
该模型
public class MyViewModel {
[Remote("ValidateAction", "Validation")]
public string Text { get; set; }
}
控制器
public partial class ValidationController : Controller
{
public virtual JsonResult ValidationAction(string aTextToValidate)
{
if(aTextToValidate == /* some condition */)
return Json(true, JsonRequestBehavior.AllowGet);
return Json("This is not valid, Try Again !", JsonRequestBehavior.AllowGet);
}
}
风景
@using (Html.BeginForm() {
@Html.TextBoxFor(m => m.Text)
@Html.ValidationMessageFor(m => m.Text)
}
就是这样,一切正常,但ValidationAction会在每次按键时触发,这是不理想的,我想只是在元素失去焦点时触发,但无法想象如何做到这一点
实际上我已经注意到,默认情况下,验证会在brl上触发一次.i.e。第一次元素失去焦点,但是当试图纠正它时,验证然后触发onKeyUp。我认为这是预期的功能,并且考虑它可能非常有用。但是,知道是否可以修改此行为会很有用
尝试
$.validator.setDefaults({ onkeyup: false });
这个对我有用。
虽然我认为没有针对此进行不显眼的验证(目的是验证每个按键的输入 - 用户友好),但这种方法有一个解决方法:
您可以将这些极少数行(由//this is my code
标记)添加到您的jquery.validate.js
并缩小它或者您可以创建一个新的.js
文件并添加以下代码。
请注意,如果你想摆脱onkeyup
的某些特定的input
(不是某些特定的规则,即远程),有一个特定的,简单的方法来做到这一点,你可以在jquery网站找到它。
此代码将仅忽略remote
事件的keyup
规则,并通常在required
和keyup
事件上验证其他人(即focuseout
)。
(function ($) {
jQuery.validator.setDefaults({
onkeyup: function (element) {
$(element).data('firedON', 'keyup') //this is my code
if (element.name in this.submitted || element == this.lastElement) {
this.element(element);
}
}
});
$.validator.methods.remote = function (value, element, param) {
if ($(element).data('firedON') == 'keyup') {
$(element).data('firedON') = '';
return "dependency-mismatch"; //this 'if' is my code(thats it)
}
if (this.optional(element))
return "dependency-mismatch";
var previous = this.previousValue(element);
if (!this.settings.messages[element.name])
this.settings.messages[element.name] = {};
previous.originalMessage = this.settings.messages[element.name].remote;
this.settings.messages[element.name].remote = previous.message;
param = typeof param == "string" && { url: param} || param;
if (previous.old !== value) {
previous.old = value;
var validator = this;
this.startRequest(element);
var data = {};
data[element.name] = value;
$.ajax($.extend(true, {
url: param,
mode: "abort",
port: "validate" + element.name,
dataType: "json",
data: data,
success: function (response) {
validator.settings.messages[element.name].remote = previous.originalMessage;
var valid = response === true;
if (valid) {
var submitted = validator.formSubmitted;
validator.prepareElement(element);
validator.formSubmitted = submitted;
validator.successList.push(element);
validator.showErrors();
} else {
var errors = {};
var message = (previous.message = response || validator.defaultMessage(element, "remote"));
errors[element.name] = $.isFunction(message) ? message(value) : message;
validator.showErrors(errors);
}
previous.valid = valid;
validator.stopRequest(element, valid);
}
}, param));
return "pending";
} else if (this.pending[element.name]) {
return "pending";
}
return previous.valid;
}
} (jQuery));
UPDATE 上面的代码确实有效但我想注意到我试图通过不带整个函数来使代码更整洁,即:
var remote = $.validator.methods.remote;
$.validator.methods.remote = function(a,b,c){
if ($(element).data('firedON') == 'keyup') return "dependency-mismatch";
return remote(a,b,c);
}
但它失败了因为在本地remote
变量中存储旧函数后,'this
'将引用其他地方,我无法在此代码上修复this
所以我带上面的代码。