2011-04-19 71 views
1

在click事件中,我调用PageMethods请求,该请求包含两个回调函数:OnServerValidationSuccess和OnServerValidationFailure。我也尝试创建一个名为clientResult的对象;访问在PageMethod调用的回调函数中设置的JavaScript变量

var clientResult = { rc: "", msg: "" }; 

    $('#btnSave').click(function() { 
     PageMethods.ServerValidateCreateCompany(companyName, domainName, country, OnServerValidationSuccess, OnServerValidationFailure); 
     alert(clientResult.rc); //this is null! 
}); 

在OnServerValidationSuccess中,结果参数包含异步响应。在那里,我尝试将它分配到clientResult

//On Success callback 
function OnServerValidationSuccess(result, userContext, methodName) { 
    clientResult = result; 
    if (clientResult.msg.length != 0) { 
     document.getElementById('resMsg').innerHTML = clientResult.msg; 
     $('#resMsg').addClass('warning'); 
    } 
} 

我分配在回调函数的result当地clientResult变量。它应该包含完整的服务器响应,由服务器端WebMethod正确发送。 但是,在调用PageMethod之后它仍为空或为空。 为了将回调中设置的变量赋值给局部变量以便我可以访问它,必须做些什么?

+0

什么是您的PageMethod的样子?没有看到这一点很难说。 – 2011-04-19 16:32:01

+0

在附注上,我会主张在PageMethod上使用HttpHandler。与使用页面相比,它的开销要少很多。 – 2011-04-19 16:35:03

回答

0

您似乎正确指定了clientResult的值,您只是在访问它太早。

您正在进行异步/非阻塞调用,这意味着它立即返回但在后台继续工作。所以你的JavaScript立即从调用中返回PageMethods.ServerValidateCreateCompany并转到alert。但您的请求还没有时间完成,您的成功回调(OnServerValidationSuccess)还没有运行,因此您得到undefinednull

您应该调用任何函数来处理响应OnServerValidationSuccess函数,这是接收响应的地方。也许这样的事情(你似乎已经在做与msg什么,只是rc移动你在这里工作以及)

//On Success callback 
function OnServerValidationSuccess(result, userContext, methodName) { 
    clientResult = result; 
    alert(clientResult.rc); //this will work 
    process(clientResult); //process the response here 
    if (clientResult.msg.length != 0) { 
     document.getElementById('resMsg').innerHTML = clientResult.msg; 
     $('#resMsg').addClass('warning'); 
    } 
} 
+0

谢谢。我没有在'OnServerValidationSuccess'中完成所有处理的原因是因为'PageMethod'在click事件处理程序中被调用,并且响应包含有条件地返回true/false以进行表单验证和提交的逻辑。这就是为什么我需要将'clientResult'变量的作用域放在回调方法之外的原因。 – woodfly 2011-04-19 16:46:29

+0

我不确定我是否理解,'clientResult'的范围仍然和以前一样,只是在不同的地方访问。 – 2011-04-19 17:05:55

+0

我想我明白你需要什么 - 你想提交/取消表单提交取决于服务器是否说这些条目是有效的,并且你想使用'clientResult.rc'作为检查。关闭我的头顶,你可能会强制请求是同步的,但这通常不被推荐,因为它会导致你的页面锁定,直到响应回来。 – 2011-04-19 17:08:46