5

次のように、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 はキーを押すたびに起動されます。これは理想的ではありません。要素がフォーカスを失ったときに起動したいのですが、これを行う方法がわかりません。

アップデート

実際、デフォルトでは、要素が最初にフォーカスを失ったときに検証が onBlur を起動することに注意しましたが、それを修正しようとすると、検証が onKeyUp を起動します。これは意図された機能であり、それについて考えるとおそらく非常に役立つと思います。ただし、この動作を変更できるかどうかを知っておくと便利です

4

2 に答える 2

5

試す

$.validator.setDefaults({ onkeyup: false });

わたしにはできる。

于 2011-03-26T18:46:09.383 に答える
2

これには目立たない検証は行われていないと思いますが(目的は、キーを押すたびに入力を検証することです-ユーザーフレンドリーです)、このアプローチには回避策があります
//this is my codeあなたjquery.validate.jsとそれを縮小するか、新しい.jsファイルを作成して以下のコードを追加することができます。特定の(特定のルール、つまりリモートではなく)特定
のものを取り除きたい場合は、jqueryサイトで見つけることができる特定の簡単な方法があります。このコードは、イベントのルール のみを無視し、他のルール (つまり、通常はオンのイベント) を検証します。onkeyupinput
remotekeyuprequiredkeyupfocuseout

(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));  

更新
上記のコードは確かに機能しますが、機能全体を持ち込まないことでコードをよりきれいにしようとしていることに注意してください。

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ため、上記のコードを使用して失敗しました。

于 2011-01-29T11:40:57.890 に答える