构建环境简介: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)来判断。
但这样的代码复用性比较差,有更好的方法可行吗?
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"]()
removeTab(this);
addTab('列表', 'Oper.aspx', '', true);
}
传递函数名?callback=parent.callback、?callback=main.callback 类似这样
其他页面:Request.QueryString["callback"]()
#3
谢谢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)来判断。
这个方法应该可行,但昨天晚上试了一下,还真不知道怎么在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) 。
就这一点,我做不到。
感谢高手赐教!
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)来判断。
但这样的代码复用性比较差,有更好的方法可行吗?
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"]()
removeTab(this);
addTab('列表', 'Oper.aspx', '', true);
}
传递函数名?callback=parent.callback、?callback=main.callback 类似这样
其他页面:Request.QueryString["callback"]()
#3
谢谢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)来判断。
这个方法应该可行,但昨天晚上试了一下,还真不知道怎么在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) 。
就这一点,我做不到。
感谢高手赐教!
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) 。
就这一点,我做不到。
感谢高手赐教!