A函数调用B函数,B函数显示DIV,用户输入数据后执行C函数,C函数执行成功后再调用A函数,何解?

时间:2022-07-22 19:14:59
开发环境:easyui + $.ajax +C# + WebService
构建环境简介:main.aspx主页面使用easyui的tab,在tab中使用<Ifram>打开了子页面oper.aspx。oper.aspx子页面通过$.ajax异步调用WebService查询数据,在WebService中验证Session,如果有Session则继续查询数据库并返回JSON格式的数据集。如果Session失效,则返回一个自定义格式的json数据。oper.aspx子页面收到WebService返回的Session失效的JSON数据之后,调用main.aspx中的Login()方法,打开登录窗口。用户登录成功之后,再继续调用oper.aspx子页面中的$.ajax方法查询数据。

说明:1、本文中所说的“方法”或者“函数”都是一回事,只是叫法不同。

已经解决的问题:
  1、Oper.aspx数据可以正常显示数据。
  2、WebSevice可以正确判断Session状态是否有效。
  3、各个页面前台都可以获取WebService返回的Session状态的JSON数据。
  4、在Oper.aspx子页面可以正确打开Main.aspx主页面中的登录窗,并且成登录成功。

需要解决的问题:
  1、如果才能在登录成功后继续执行调用登录窗时的函数?
  2、登录函数希望可以复用。即有很多种情况下都要验证Session。所以要求登录成功后能够执行任何函数。(回调?)

下面贴代码,请高手指点:

main.aspx页面中打开登录窗并且验证登录的几个函数

        //调用此方法后打开登录窗
        function OperLogin(fuc) {
            $('#ShowLogin').dialog('open').dialog('setTitle', '操作员登录');
            //$('#form_OperLogin').form('clear');
        }

        //用户点击“登录”按钮后执行此方法
        function BtnOperLogin() {
            $('#form_OperLogin').form('submit', {
                onSubmit: function () {
                    //表单验证
                    var isvalidate = $("#form_OperLogin").form('validate');
                    if (isvalidate == true) {
                        parent.$.messager.progress({ title: "", msg: "", text: "正在组织数据,请稍候……" });
                        WorkID = $('#WorkID').textbox('getValue');
                        PassWord = $('#PassWord').textbox('getValue');
                        //调用异步方法,在数据库中查找对应记录
                        DB_OperLogin(WorkID, PassWord);
                    }
                    else {
                        //do something....
                    }
                    return false;
                },
                success: function (data) {
                }
            });
        }

        //用户点击登录按钮后,数据验证完毕之后,调用此方法访问 WebService
        function DB_OperLogin(WorkID, PassWord) {
            parent.$.messager.progress({ title: "", msg: "", text: "正在提交数据,请稍候……" });
            $.ajax({
                type: "POST",
                contentType: "application/json",
                url: "OperInfoaaa.asmx/OperLogin",
                timeout: 25000, //超时时间设置,单位毫秒
                data: "{'wid':'" + WorkID + "','pwd':'" + PassWord + "'}",
                dataType: 'json',
                success: function (result) {
                    try {
                        person = $.parseJSON(result.d)
                        if (person.state == 1 && person.count > 0) {
                            var re = person.data;
                            parent.$.messager.alert('成功', "恭喜:登录成功!", 'info');
//我希望在这里,继续执行登录前执行的方法。
//因为考虑到代码的重用性。我希望不同子页面的不同函数,调用登录并且登录成功后能够继续执行登录前的方法
                        }
                        else {
                            parent.$.messager.alert('失败', person.msg, 'warning');
                            return true;
                        }
                    } catch (e) {
                        parent.$.messager.alert('失败', result.d, 'info');
                    }
                    parent.$.messager.progress('close');
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    AjaxError(XMLHttpRequest, textStatus, errorThrown);
                }
            });
        }


oper.aspx子页面的几个方法

function GetJG(pageCurr, pageSize) {
            $.ajax({
                type: "POST",
                contentType: "application/json",
                url: "Select.asmx/GetJGByPage",
                timeout: 10000, //超时时间设置,单位毫秒
                data: '{"CurrentPage":' + pageCurr + ',"PageSize":' + pageSize + ',"Sort":' + null + ',"Filter":' + null + '}',
                dataType: 'json',
                success: function (result) {
                    person = $.parseJSON(result.d)
                    if (person.state == 1 && person.count > 0) {
                        var re = {};
                        re.rows = person.data;
                        re.total = person.count;
                        $("#JG_DataGird").datagrid('loadData', re);
                        parent.$.messager.progress('close');
                    }
                    else if (person.state == -999) {
                        //如果WebService返回Session失效的JSON,则调用主页面的OperLogin()函数。
                        //我在想是不是可以把 GetJG(pageCurr, pageSize) 方法做为参数传给主页面的OperLogin()函数?
                        //如果可以的话, GetJG(pageCurr, pageSize) 里面的两个参数如何传过去?
                        //如果可以的话, 传过去的两个参数,在OperLogin()中如何接收?
                        //如果可以的话, OperLogin()只是Show出了登录窗,而这个GetJG(pageCurr, pageSize) 要在用户按下登录按钮并且异步执行成功之后才调用,参数怎么传?
                        window.parent.window.OperLogin();
                        parent.$.messager.progress('close');
                    }
                    else {
                        //$.jBox.error(person.msg, '未找到合适的网点');
                        //$.jBox.closeTip();
                        parent.$.messager.progress('close');
                        parent.$.messager.alert('未找到合适的网点', person.msg, 'warning');
                        return true;
                    }
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                    AjaxError(XMLHttpRequest, textStatus, errorThrown);
                }
            });
            return false;
        }



以上问题,请 高手赐教!

5 个解决方案

#1


1、调用登录时可以加一个状态标记传给登录窗(比如加一个隐藏字段,from="页面A方法a")
2、登录成功后,可以加若干个if(页面N的方法n)来判断。

                            if ('页面A方法a') {
                                window.parent.window.removeTab(this);
                                window.parent.window.addTab('列表', 'Oper.aspx', '', true);
                            }
                            else if ('页面B方法b') {
                                window.parent.window.removeTab(this);
                                window.parent.window.addTab('列表1', 'Oper1.aspx', '', true);
                            }
                            else if ('页面N方法n') {
                                window.parent.window.removeTab(this);
                                window.parent.window.addTab('列表2', 'Oper2.aspx', '', true);
                            }
                            else
                            { }


但这样的代码复用性比较差,有更好的方法可行吗?

#2


function callback(){
removeTab(this);
addTab('列表', 'Oper.aspx', '', true);
}
传递函数名?callback=parent.callback、?callback=main.callback 类似这样
其他页面:Request.QueryString["callback"]()

#3


引用 2 楼 slwsss 的回复:
function callback(){
removeTab(this);
addTab('列表', 'Oper.aspx', '', true);
}
传递函数名?callback=parent.callback、?callback=main.callback 类似这样
其他页面:Request.QueryString["callback"]()


谢谢2楼的回复,这样做可能有问题:
1、Oper.aspx子页面是Main.aspx主页面中的一个iFrame,iFrame的Src在Main.aspx打开的时候已经固定,当时并不知道Oper.aspx中的函数是否要调用Main.aspx中的登录函数,也不知道是Oper.aspx子页面中的哪个方法要调用Main.aspx主页面中的登录函数。所以采用URL传参的方法是不可行的。
2、Main.aspx主页面中可能有多个iFrame(即多个子页面),任何一个子页面中的任何一个函数在任何时候,都有可能要调用Main.aspx中的登录函数。所以也不可能在Main.aspx加载的时候就传参数过去。
3、就算能把函数名当做参数传给MAin.aspx,我也不知道该如何在Main.aspx中调用子页面中的函数。Request.QueryString["callback"]()虽然可以接收到函数名,但也仅仅是一个字符串吧?如何执行?

#4


其实,我想要实现的,说穿了也很简单。就是像CSDN这样。
未登录之前打开这个贴子,
写好回复内容之后,点击提交回复。
然后会验证是否登录、是否有回复权限等等,如果登录有效则提交。
如果登录无效,则弹出登录窗,
登录成功以后,不需要再次点击“提交回复”按钮,程序会自动接着弹出登录窗之前的步骤执行提交事件。

而我现在的问题是,登录成功以后,不知道该怎么调用提交函数,只能重新点一下提交才能成功。
虽然整个过程而页也不会刷新,但总感觉不美。

#5


1、调用登录时可以加一个状态标记传给登录窗(比如加一个隐藏字段,from="页面A方法a")
2、登录成功后,可以加若干个if(页面N的方法n)来判断。

                            if ('页面A方法a') {
                                执行页面A的方法a(参数1,参数2,参数N);
                            }
                            else if ('页面B方法b') {
                                执行页面B的方法b(参数1,参数2,参数N);
                            }
                            else if ('页面N方法n') {
                                执行页面C的方法c(参数1,参数2,参数N);
                            }
                            else
                            { }


这个方法应该可行,但昨天晚上试了一下,还真不知道怎么在Main主页面中调用Oper子页面中的函数。

Main.aspx是主页面,使用easyui的tab,在tab中打开了<iFrame src="Oper.aspx“></iFrame>子页面。在Oper子页面中的一个ajax异步函数GetJG(pageCurr, pageSize) ,GetJG(pageCurr, pageSize) 函数异步执行完成后调用了Main中的函数OperLogin(fuc)打开登录窗。然后调用了Main中的异步登录函数DB_OperLogin(WorkID, PassWord)异步验证登录结果。

我希望,异步验证登录结果成功之后,再回调刚才调用Main中登录函数OperLogin(fuc)的<iFrame src="Oper.aspx“></iFrame>子页面中函数GetJG(pageCurr, pageSize) 。
就这一点,我做不到。

感谢高手赐教!

#1


1、调用登录时可以加一个状态标记传给登录窗(比如加一个隐藏字段,from="页面A方法a")
2、登录成功后,可以加若干个if(页面N的方法n)来判断。

                            if ('页面A方法a') {
                                window.parent.window.removeTab(this);
                                window.parent.window.addTab('列表', 'Oper.aspx', '', true);
                            }
                            else if ('页面B方法b') {
                                window.parent.window.removeTab(this);
                                window.parent.window.addTab('列表1', 'Oper1.aspx', '', true);
                            }
                            else if ('页面N方法n') {
                                window.parent.window.removeTab(this);
                                window.parent.window.addTab('列表2', 'Oper2.aspx', '', true);
                            }
                            else
                            { }


但这样的代码复用性比较差,有更好的方法可行吗?

#2


function callback(){
removeTab(this);
addTab('列表', 'Oper.aspx', '', true);
}
传递函数名?callback=parent.callback、?callback=main.callback 类似这样
其他页面:Request.QueryString["callback"]()

#3


引用 2 楼 slwsss 的回复:
function callback(){
removeTab(this);
addTab('列表', 'Oper.aspx', '', true);
}
传递函数名?callback=parent.callback、?callback=main.callback 类似这样
其他页面:Request.QueryString["callback"]()


谢谢2楼的回复,这样做可能有问题:
1、Oper.aspx子页面是Main.aspx主页面中的一个iFrame,iFrame的Src在Main.aspx打开的时候已经固定,当时并不知道Oper.aspx中的函数是否要调用Main.aspx中的登录函数,也不知道是Oper.aspx子页面中的哪个方法要调用Main.aspx主页面中的登录函数。所以采用URL传参的方法是不可行的。
2、Main.aspx主页面中可能有多个iFrame(即多个子页面),任何一个子页面中的任何一个函数在任何时候,都有可能要调用Main.aspx中的登录函数。所以也不可能在Main.aspx加载的时候就传参数过去。
3、就算能把函数名当做参数传给MAin.aspx,我也不知道该如何在Main.aspx中调用子页面中的函数。Request.QueryString["callback"]()虽然可以接收到函数名,但也仅仅是一个字符串吧?如何执行?

#4


其实,我想要实现的,说穿了也很简单。就是像CSDN这样。
未登录之前打开这个贴子,
写好回复内容之后,点击提交回复。
然后会验证是否登录、是否有回复权限等等,如果登录有效则提交。
如果登录无效,则弹出登录窗,
登录成功以后,不需要再次点击“提交回复”按钮,程序会自动接着弹出登录窗之前的步骤执行提交事件。

而我现在的问题是,登录成功以后,不知道该怎么调用提交函数,只能重新点一下提交才能成功。
虽然整个过程而页也不会刷新,但总感觉不美。

#5


1、调用登录时可以加一个状态标记传给登录窗(比如加一个隐藏字段,from="页面A方法a")
2、登录成功后,可以加若干个if(页面N的方法n)来判断。

                            if ('页面A方法a') {
                                执行页面A的方法a(参数1,参数2,参数N);
                            }
                            else if ('页面B方法b') {
                                执行页面B的方法b(参数1,参数2,参数N);
                            }
                            else if ('页面N方法n') {
                                执行页面C的方法c(参数1,参数2,参数N);
                            }
                            else
                            { }


这个方法应该可行,但昨天晚上试了一下,还真不知道怎么在Main主页面中调用Oper子页面中的函数。

Main.aspx是主页面,使用easyui的tab,在tab中打开了<iFrame src="Oper.aspx“></iFrame>子页面。在Oper子页面中的一个ajax异步函数GetJG(pageCurr, pageSize) ,GetJG(pageCurr, pageSize) 函数异步执行完成后调用了Main中的函数OperLogin(fuc)打开登录窗。然后调用了Main中的异步登录函数DB_OperLogin(WorkID, PassWord)异步验证登录结果。

我希望,异步验证登录结果成功之后,再回调刚才调用Main中登录函数OperLogin(fuc)的<iFrame src="Oper.aspx“></iFrame>子页面中函数GetJG(pageCurr, pageSize) 。
就这一点,我做不到。

感谢高手赐教!