2014-09-02 66 views
0

我有一个网站,我想在我的数据库,设置用户状态为0(离线),当用户想退出该网站一个ASP.NET方法,问题是我试图激发Page_Unload方法,但没有按”吨的工作,我发现了一些Javascript代码可以工作,但这个JavaScript代码显示了一个通知,当你想离开网站,并在这段代码中,我想调用一个ASP.NET方法来更改数据库中的数据,但不起作用。提前!从JavaScript调用

// Javascript code 
    window.onbeforeunload = confirmExit; 

function confirmExit() { 
    PageMethods.OnlineOut(); 
} 

//This is on my Master Page 
<script type="text/javascript" src='<%= ResolveClientUrl("~/JavaScript.js") %>'></script> 

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true"> 
</asp:ScriptManager> 

//This is on my Content Page.cs 
[WebMethod] 
    public void OnlineOut() 
    { 
     SqlConnection conexiune = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); 
       SqlCommand SetareOnline = new SqlCommand("Update [dbo].[Table] Set Online=0 Where([email protected])", conexiune); 
       SetareOnline.Parameters.AddWithValue("@UserName", Session["Login"].ToString()); 
       conexiune.Open(); 
       SetareOnline.ExecuteNonQuery(); 
       conexiune.Close(); 
    } 
+0

你的页面方法应该是静态的。 – Mairaj 2014-09-02 12:32:57

回答

1

你说你试过Page_Unload它没有工作;你试过它意味着你没有阅读页面生命周期,在MSDN清楚地记录。 unload事件的功能是从该链接开始的:

卸载在页面完全呈现,发送到客户端并准备放弃之后调用。此时,响应和请求等页面属性被卸载并执行任何清理。

对于要调用的功能,你需要使用AJAX从JavaScript进行调查,并处理window.onbeforeunload事件(见this StackOverflow question进行了全面的答案)。

尽管如此,这仍然不能保证工作 - 它仍然有可能退出浏览器,而不会触发该呼叫,用户将被保留为“主动”。

一个更加可靠的解决方案是实现以预定间隔(比如说,每隔十秒或每分钟)运行的“心跳”,并调用Web服务来说“是的,我还在这里”。然后记录上次触发心跳的次数,并且如果您在设定的时间内(例如2分钟)没有收到呼叫,则将该用户计为离线。关于这方面的想法见this question