2009-03-21 10 views
2

私は自分のコントローラにあるアクションメソッドにajax呼び出しを行っている外部JavascriptファイルにいくつかのjQueryコードを持っています。外部のJavascriptファイルのコードは次のとおりです。アクションメソッドは最終的に呼び出されていますが、時間内に呼び出されていません。アクションメソッドにブレークポイントを設定すると、送信ボタンのクリックがfalseを返すまで呼び出されません。 EmailExist関数が "isvalid"を返すとき、isvalidは未定義です。ASP.NET MVC jQuery AJAX呼び出しアクションメソッドが遅すぎますか?

最終的に呼び出されるアクションメソッドの問題ではなく、何らかの理由でEmailExistが常にundefinedを返し、MVC Actionメソッドがボタンクリックが返されるまで呼び出されません。何かご意見は?

処置方法:

 [AcceptVerbs(HttpVerbs.Post)] 
    public JsonResult EmailExist(string email) 
    { 
     Account account = _generalService.GetAccountByEmail(email); 

     bool exist = false; 
     if (account != null) 
      exist = true; 

      return Json(new { indb = exist }); 
    } 

のJavascript:

$(document).ready(function() { 
$("input[type=submit]").click(function() { 

    var valid = true; 

    // email - check required and valid 

    var email = $("input[name='email']"); 
    var emailtrim = jQuery.trim(email.val()); 

    // email exists in db ajax request 
    if (EmailExist(emailtrim)) { 
     valid = false; 
    } 

    return valid; 
}) 

function EmailExist(emailval) { 

    var isvalid; 

    // hit db 
    $.ajax(
    { 
    type: "POST", 
    url: "/Account/EmailExist", 
    data: { 'email': emailval }, 
    success: function(result) { 

     if (result.indb) { 
      isvalid = true; 

     } 
    }, 
    error: function(error) { 
     alert(error); 
    } 
}); 

    return isvalid; 
} 

})。

答えて

6

リクエストが同期しているように見えます。これを実現するには、リクエストのasyncオプションをfalseに設定する必要があります。デフォルトでは、要求が完了する前にajax呼び出しから戻るように要求を非同期にすることです。あるいは、成功コールバックが実際に作業を行うようにコードを書き直すこともできます。後者はAJAXにとってもっと慣れていますが、時にはもっと複雑なこともあります。

$.ajax(
    { 
    type: "POST", 
    async: false,    // <- note addition 
    url: "/Account/EmailExist", 
    data: { 'email': emailval }, 
    success: function(result) { 

     if (result.indb) { 
      isvalid = true; 

     } 
    }, 
    error: function(error) { 
     alert(error); 
    } 
}); 

OR

$("input[type=submit]").click(function() { 

    // email - check required and valid 

    var form = $(this).parent('form'); 
    var email = $("input[name='email']"); 
    var emailtrim = jQuery.trim(email.val()); 

    SubmitIfNoEmailExists(form,emailtrim); 

    return false; 
}); 

function SubmitIfNoEmailExists(form,emailval) { 

    // hit db 
    $.ajax({ 
     type: "POST", 
     url: "/Account/EmailExist", 
     data: { 'email': emailval }, 
     success: function(result) { 
      if (!result.indb) { 
       form.submit(); 
      } 
     }, 
     error: function(error) { 
      alert(error); 
     } 
    }); 
} 

EDIT:あなたのコメントに基づいて、また、あなたの検証ニーズのすべてに対する解決策として、jQueryのvalidation pluginを使用して見てみたいことがあります。

+0

これは私の問題を解決していないようです。とにかくこれは外部のJSファイルにある呼び出しに関連する可能性がありますか? JSとActionMethodの両方にブレークポイントを設定し、残りのJSコードが実行されるまでActionMethdは呼び出されません。それ以上の考え? – aherrick

+0

私は電子メールがまだ存在しない場合、フォームを送信するajaxコールバックを持つ代替を追加しました。 – tvanfosson

+0

素晴らしい!しかし、ここに問題がある、私は電子メールを検証し、スクリプトの後半でさらに検証を続ける必要がある。基本的に電子メールが存在しない場合は、フォームを送信するだけではありません。それはboolを裏返す必要があります。ここでjavascriptの最後に、私はtrueまたはfalseを返して提出します。 – aherrick

関連する問題