0

我在我的 ASP.NET MVC3 网站中有一个部分,用户可以在其中单击一个按钮以将条目添加到他们帐户中的“已保存项目”部分。这是通过 JQuery Ajax 请求完成的,如果他们已登录,则效果很好。如果他们没有登录,我希望他们被重定向到登录页面,然后自动将条目添加到他们的 Saved项目部分。

我让所有部分单独工作 - 即当单击按钮时,如果未登录,则会显示登录框。登录弹出窗口也可以成功运行。问题是试图一次无缝地完成所有事情。这是我到目前为止的代码:

保存按钮的单击事件 - 检查用户是否一路登录:

    var loggedIn = false;

    $(document).ready(function () {
        $('a#saveSearch').live('click', function (event) {
            $.get('@Url.Action("IsLoggedIn", "Account", null)', function (response) {
                if (response == "True")
                    loggedIn = true;
                else
                    loggedIn = false;
            });
            if (loggedIn){
                SaveSearch();
            }
            else{                        
                $('#dialog').dialog('open');
                SaveSearch(); //don't think this is correct because it hits this line before login is complete
            }
        });

保存到数据库的功能:

        function SaveSearch(){                    
            var url = '@Url.Action("SaveSearch", "User")';
            $.ajax({
                url: url,
                type: 'POST',
                contentType: "application/json; charset=utf-8",
                data: JSON.stringify({
                    json: "@Html.Raw(Session["MyFormString"].ToString())"
                }),
                success: function (data) {
                    $('a#saveSearch').attr('disabled', "disabled");
                    $('div#savedResponse').html('<p>Search saved to user account</p>');
                },
                error: function () {
                }
            });
        }
    });

JQuery UI 对话框弹出:

$(function () {
    $('#dialog').dialog({
        autoOpen: false,
        width: 400,
        resizable: false,
        title: 'Login',
        modal: true,
        open: function(event, ui) {
            $(this).load("@Url.Action("Logon", "Account", null)");
        },
        buttons: {
            "Close": function () {
                $(this).dialog("close");
            }
        }
    });

我认为我的代码有一些根本性的问题,因为这样,登录弹出窗口只出现一秒钟,然后立即消失。看起来我需要让它停止推进代码,直到登录完成。

任何有助于实现这一目标的建议或帮助将不胜感激。

4

2 回答 2

1

我想你的问题可能与:

$.get('@Url.Action("IsLoggedIn", "Account", null)', function (response) {
  if (response == "True")
    loggedIn = true;
  else
    loggedIn = false;
});
if (loggedIn){
  SaveSearch();
}
else{                        
  $('#dialog').dialog('open');
  SaveSearch(); //don't think this is correct because it hits this line before login is complete
}

调用是异步的$.get,这意味着后面的代码:

if (loggedIn){

在服务器响应之前正在执行。您需要将该代码放在响应回调中:

$.get('@Url.Action("IsLoggedIn", "Account", null)', function (response) {
  if (response == "True")
    loggedIn = true;
  else
    loggedIn = false;

  if (loggedIn){
    SaveSearch();
  }
  else{                        
    $('#dialog').dialog('open');
    SaveSearch(); //don't think this is correct because it hits this line before login is complete
  }
});
于 2012-06-08T09:31:58.673 回答
1

尝试为您的模态添加一个关闭回调函数,然后代码只会在模态关闭并且所有登录成功完成后才完成。查看代码中的注释

$(document).ready(function () { 
    $('a#saveSearch').live('click', function (event) { 
        $.get('@Url.Action("IsLoggedIn", "Account", null)', function (response) { 
            if (response == "True") 
                loggedIn = true; 
            else 
                loggedIn = false; 
        }); 
        if (loggedIn){ 
            SaveSearch(); 
        } 
        else{  
            //in this dialog, add a close handler,then add the SaveSearch(); function in that handler
            $('#dialog').dialog('open'); 

           } 
    }); 
于 2012-06-08T09:36:01.963 回答