2011-10-06 108 views
4

所以我需要做一些事情,当用户离开页面。 我想我可以使用JQuery window.unload捕获该事件,但我不确定如何将一些数据保存回数据库。ASP.NET MVC - 在页面卸载

我很高兴打电话给另一个动作或类似的东西,但我不想阻止用户进入他们前往的页面。

任何想法?

更新:解决方案

这里是我去解决(我会做出错误处理更好一点后:))。

因为我需要执行删除操作,所以在阅读本文后添加了一些额外的安全性; http://stephenwalther.com/blog/archive/2009/01/21/asp.net-mvc-tip-46-ndash-donrsquot-use-delete-links-because.aspx

在视图:

$(window).unload(function() { 
    var ajurl = "/Assignments/unlockAssignment/" + '@model.ID' + "/"; 
    $.ajaxSetup ({ 
     cache: false 
    }); 

    $.ajax({ 
     type: "DELETE", 
     url: ajurl, 
     error: function (xhr, status, error) { 
      //do something about the error 
      alert('error'); 
     }, 
     success: function(){ 
     alert('Data Saved:'); 
     } 
    }); 
}); 

的控制器

<AcceptVerbs(HttpVerbs.Delete)> 
<Authorize()> 
Function unlockAssignment(ByVal id As Integer) 
    Dim ass As Assignment = db.Assignments.Find(id) 

    Dim lck = From a In db.AssignmentLocks 
        Where a.ID = ass.Lock.ID 
        Select a 

    db.Entry(lck.FirstOrDefault).State = EntityState.Deleted 
    db.SaveChanges() 

End Function 

回答

4

你可以只开枪$一个Ajax请求(窗口).unload() - 我不认为这会阻碍用户。

但是,我认为您不能确认ajax调用的结果,即通过回调处理返回的数据。我认为那时页面会“继续前进”。把它看作是一场“火与忘”。

如果您需要某种确认ajax调用成功或处理返回的数据,请在卸载前查找方法。

+0

火和忘记的声音很好。我试图实现锁定功能,以便其他用户无法编辑记录,如果其他用户打开它。 我以前没有真正使用过Ajax;有人能提供一个简单的例子吗? – Tom

+0

@Tom:在这里查看复合视频视频:http://www.asp.net/mvc(他们是免费的,非常好的起点)。 –

+0

我已经完成了这一点,虽然与PHP。没有太大的区别 - 关键是使用'$(window).unload()',并且确实假设请求没有做任何事情。它似乎工作正常。 – Cymen