0

私は ASPxGridview を持っており、ClientSideEvents を使用して以前に編集フォームに電子メールが登録されているかどうかを確認したいと考えています。

この問題を解決するための助けはありますか?

aspx セクション

これはJavaScriptセクションです

function OnEmailValidation(s, e) {
            var error = "";
            var tfld = trim(e.value);
            var illegalChars = /^\w+([-+.'''']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
            if (!illegalChars.test(tfld)) {
                $get("spanEmail").innerHTML = "invalid email";

            } else {
                PageMethods.CheckEmail(e.value.toString(), OnCheckEmail);

                // how to check OnCheckEmail before continue
                //if(email already registered) {
                  // return false
                //}

                $get("spanEmail").innerHTML = "";
            }
            return true;
        }

function OnCheckEmail(unavailable) {
        if (unavailable == true) {
            $get("spanEmail").innerHTML = "already registered";
            $get("spanEmail").style.color = "red";
        }
        else if (unavailable != true) {
            $get("spanEmail").innerHTML = "Available";
            $get("spanEmail").style.color = "#76EB69";
        }
    }

aspx.cs

col_Email.PropertiesTextEdit.ClientSideEvents.Validation = "OnEmailValidation";
grid.Columns.Add(col_Email);

[WebMethod]
public static bool CheckEmail(string email)
{
    System.Threading.Thread.Sleep(200);
    if (Membership.FindUsersByEmail(email) != null)
    {
        if (Membership.FindUsersByEmail(email).Count <= 0)
        {
            return false;
        }
        return true;
    }
    else
    {
        return false;
    }
}

これはFilipの アドバイス の後の最終的なコードですが、 小さな問題があります:
When i use
(async: false) and cntr.SetIsValid(false);
コントロールはアクションを適用しませんが、 (async: true) と cntr.SetIsValid(false); を
使用する と コントロールがアクションを適用 する


async: false を使用したい


function OnEmailValidation(s, e) {
var illegalChars = /^\w+([-+.'''']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
var spanEmail = document.getElementById("spanEmail");

var obj = GetObj('txt_Email');
var cntr = aspxGetControlCollection().Get(obj.id);

if (!illegalChars.test(e.value)) { 
    spanEmail.innerHTML = "Invalid Email";
    spanEmail.style.color = "red";

    cntr.SetIsValid(false);

} else {
    $.ajax({
        type: "POST",
        async: false,
        url: "myweb_service.asmx/CheckEmail",
        data: "{'email':'" + e.value.toString() + "'}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(res) {
            if (res.d == "true") {
                spanEmail.innerHTML = "Email register before";
                spanEmail.style.color = "red";

                cntr.SetIsValid(false);
            }
            if (res.d == "false") {
                spanEmail.innerHTML = "Available";
                spanEmail.style.color = "#76EB69";

                cntr.SetIsValid(true);
            }
        }
    });
}}
4

2 に答える 2

0

jQuery を使用して PageMethods を呼び出すことができます ( PageMethods.CheckEmailcall を次のコードに置き換えます)。

$.ajax({
    type: "POST",
    async: false,
    url: "<PageName>.aspx/CheckEmail",
    data: "{" + e.value.toString() + "}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(res) {
        if (res.d)
            return false;
    }
});

PageNameページ名に置き換えます。
同期 ( async: false) ajax 呼び出しには注意してください。リクエストが完了するまで、彼らはあなたのページをブロックします。結果が返されない
場合、または投稿されたコードの詳細な説明が必要な場合は、次のリンクを確認してください。res.d

于 2012-04-13T07:14:15.560 に答える
0

電子メールが既に存在するかどうかを確認する Web サービスをサーバー側でセットアップする必要があります。次に、JavaScript AJAX (できれば jQuery や Prototype などのライブラリ) を使用して、検証メソッド中に Web サービスをクエリします。

すべてをセットアップするにはかなりの作業が必要です。幸運を。詳細については、次のリンクのいずれかを参照してください。

于 2012-04-12T20:10:38.060 に答える