日期:2014-05-17  浏览次数:20440 次

ASP.NET 前台与后台交互
    Hi,dear all,向你们问一个问题:
    在一个Home.aspx中有一个button,代码是
    
 <asp:Button  CssClass="logout" runat="server" Text="Logout" OnClick="LogoutBtn_Click" />

    相应后台代码Home.aspx.cs是
    
public void LogoutBtn_Click(object sender, EventArgs e)
    {   
       userLogin.AccountLogout(loginOutput, LogoutDone);
    }

     LogoutDone这个回调函数是
     
void LogoutDone(object sender, StatusEventArgs e)
    {
         ClientScript.RegisterStartupScript(ClientScript.GetType(), "myscript0", "<script>logoutCallback();</script>");
    }

    
    logoutCallback()是一个前台函数,我的问题是:进入回调函数LogoutDone时Page_Load函数已经退出了,此时页面已经返回了客户端,用ClientScript.RegisterStartupScript无法调用前台函数logoutCallback(),我怎样才可以在LogoutDone里调用前台函数logoutCallback()?
ASP.NET 服务器 ASP.NET前台与后台交互

------解决方案--------------------
我试了一下,如果直接在Button按钮的click事件中这样写:
         ClientScript.RegisterStartupScript(ClientScript.GetType(), "myscript0", "<script>logoutCallback();</script>");

然后在前台定义一个同名的Js函数是可以调用的,你可以把RegisterStartupScript这句直接放到Button的click事件处理程序中试试,看能不能成功调用
------解决方案--------------------
asp.net本身处理各个消息请求就是异步多线程的,而用户定义的处理过程并不支持异步编程。如果一定要异步,你可以搜索有关“asp.net 异步”的文章(尽管它一般来说没有什么用)。

既然asp.net不支持异步,那么你就需要阻塞你的异步操作,去模拟同步操作。具体来说,类似于写
private ManualResetEvent mh;

public void LogoutBtn_Click(object sender, EventArgs e)
    {   
       mh = new ManualResetEvent(false);
       userLogin.AccountLogout(loginOutput, LogoutDone);