ASP.NET AJAX示例:文档锁定程序

开发 后端
本文介绍了一个ASP.NET AJAX示例:文档锁定程序。此示例属于简单的文档管理系统。如任何正式的文档管理系统一样,我们必须提供并发管理。

ASP.NET AJAX示例:文档锁定程序

此示例属于简单的文档管理系统。如任何正式的文档管理系统一样,我们必须提供并发管理。即,我们需要一种方法来处理两个用户尝试编辑同一个文档的问题。我们将通过创建某种类型的锁定机制,来使正在编辑的文档不能再由另一个用户编辑,从而达到上述目的。我们将利用 AJAX 让用户有更愉快的锁定机制体验。首先,我们将创建用户尝试编辑但无法编辑(因为其他用户正在编辑该文档)的文档队列,当这些文档可用时自动通知用户。其次,我们将确保当用户关闭其浏览器或导航到其他位置时,解除对文档的锁定。后一个功能帮助确保文档不会永远处于锁定状态。为此,在本指南中,我们将跳过与 AJAX 实现不相关的功能;但是,可下载项目包含所有功能。

首先,当用户尝试编辑文档时,我们会尝试对其建立排它锁,如果失败,我们会将此文档添加到用户的队列然后使其返回到主页。对此处的 AJAX 没有什么特别之处,但是我们将查看一下代码,以便给出示例必要的上下文。在用于编辑的 Page 的 OnLoad 事件中,添加以下代码。

  1. //C#:ASP.NET AJAX示例  
  2. if (!Page.IsPostBack)  
  3. {  
  4. //应验证用户输入  
  5. Document document = GetDocument(Request.QueryString["id"]);  
  6. //我们拥有此文档,但不能编辑它!  
  7. if (!Locker.AcquireLock(document))  
  8.  {  
  9. //让我们将它添加到要查看的用户文档列表  
  10. User.CurrentUser.AddDocumentToQueue(document.DocumentId);  
  11. Response.Redirect("DocumentList.aspx");  
  12.  }  
  13. //好了,我们拥有此文档,并且可以编辑它  
  14.  //...  
  15. }  

关键行的位置是将文档添加到当前用户的队列中(这会将文档添加到会话中)。接下来,我们将创建用户控件,该控件可以被放置到任何页上,用于当队列文档可用时通知用户。此用户控件将包含一个 AJAX 方法以及注册 AJAX 的类所需的代码。

  1. 'VB.NET:ASP.NET AJAX示例  
  2. Private Sub Page_Load(s As Object, e As EventArgs)   
  3. Handles MyBase.Load  
  4. Ajax.Utility.RegisterTypeForAjax(GetType(UnlockNotifier))  
  5. End Sub 
  6. '遍历队列文档并检查它们是否可用  
  7. < Ajax.AjaxMethod()> _  
  8. Public Function GetUnlockedDocuments() As DocumentCollection  
  9. '获得属于用户的所有队列文档的 ID  
  10. Dim queuedDocument As ArrayList = User.CurrentUser.DocumentQueue  
  11. Dim unlocked As DocumentCollection = New DocumentCollection  
  12. For Each documentId As Integer In queuedDocumentIds  
  13. '如果队列文档不再被锁定  
  14. If Not Locker.IsLocked(documentId) Then 
  15. unlocked.Add(Document.GetDocumentById(documentId))  
  16. End If 
  17. Next 
  18. Return unlockedDocuments  

End Function现在需要的是使一些 JavaScript 发出请求并处理响应。我们将基于响应在要动态创建的表中放置已发布的文档信息(如果有)。为此,我们将开始编写 HTML。

  1. < div id="notifyBox" style="display:none;"> 
  2. < b>The following queued documents can now be edited< /b> 
  3. < table cellpadding="5" cellspacing="0" 
  4. border="0" style="border:1px solid #EEE;" 
  5. id="notifyTable"> 
  6. < /table> 
  7. < /div> 

如果没有可用的文档(或是没有为该用户列出文档),我们使用 DIV 标记隐藏所有内容,用 TABLE 标记来显示结果。我们将使用轮询系统来检查是否存在任何可用的队列文档。一般来说,这意味着我们将在稍后一段时间内一直调用服务器端方法,并显示结果。在加载页面时仅发生第一次调用,每隔 X 秒发生后续调用。

  1. < script language="javascript">  
  2. window.setTimeout("PollQueue();", 2000);  
  3. //每隔 2 秒激发以检查在具有许多用户的实际系统中是否发布了  
  4. //队列文档,2 秒可能会使服务器承受  
  5. //过高的负荷。我们甚至可以首先检查用户是否  
  6. //拥有队列,但是我们确实需要进行一些  
  7. //性能测试  
  8. function PollQueue()  
  9. {  
  10. //UnlockNotifier 是我们使用 Ajax.NET 注册的类型  
  11. //GetUnlockedDocuments 是该类型中的方法,标有  
  12. //AjaxMethod 属性  
  13. UnlockNotifier.GetUnlockedDocuments(PollQueue_CallBack);  
  14. //每隔 2 秒调用其本身  
  15. window.setTimeout("PollQueue();", 2000);  
  16. }  
  17. < /script>  

剩下的就是处理响应。这与以前示例中的代码相似。首先,检查是否存在错误,获得响应,遍历可用的文档,动态创建 HTML,在这种情况下,向表中添加行和列。

  1. function PollQueue_CallBack(response)  
  2. {  
  3. var notifyBox = document.getElementById("notifyBox");  
  4. var notifyTable = document.getElementById("notifyTable");  
  5. //如果我们无法找到表通知框  
  6. if (notifyBox == null || notifyTable == null)  
  7.   {  
  8. return;  
  9.   }  
  10. //如果服务器端代码出现异常  
  11. if (response.error != null)  
  12.   {   
  13. notifyBox.style.display = "none";   
  14. alert(response.error); //我们应该能做得更好  
  15. return;  
  16.   }    
  17. var documents = response.value;  
  18. //如果不是我们所希望的响应  
  19. if (documents == null || typeof(documents) != "object")  
  20.   {  
  21. notifyBox.style.display = "none";  
  22. return;  
  23.   }    
  24. for (var i = 0; i <  notifyTable.rows.length; ++i)  
  25.   {  
  26. notifyTable.deleteRow(i);  
  27.   }  
  28. for(var i = 0; i <  documents.length; ++i)  
  29.   {      
  30. var row = notifyTable.insertRow(0);  
  31. row.className = "Row" + i%2;  
  32. var cell = row.insertCell(0);  
  33. cell.innerHTML = documents[i].Title;  
  34. cell = row.insertCell(1);  
  35. var date = documents[i].Created;  
  36. cell.innerHTML = date.getDay() + "/" + date.getMonth()   
  37. "/" + date.getYear();  
  38. cell = row.insertCell(2);  
  39. cell.innerHTML = "< a href='DocumentEdit.aspx?id="   
  40. + documents[i].DocumentId + "'>edit< /a>";  
  41.   }   
  42. notifyBox.style.display = "block";  
  43. }  

我们要看到的最后一个快速改进是当用户关闭浏览器、导航到其他链接或单击“后退”按钮时,将自动解除文档锁定。通常,可以通过触发 JavaScript OnBeforeUnLoad 事件或 OnUnload 事件达到此目的,这会打开新的小型弹出式窗口,该弹出式窗口在加载页面时做一些清理然后自行关闭。您自己可以使用弹出式窗口,但是其他人则不能使用,它将导致弹出式窗口受阻并使文档永久保持锁定状态。要解决此问题,我们仍需要两个 JavaScript 事件,但是并不是启动弹出式窗口,而是将通过 AJAX 执行服务器端方法。在用于编辑文档的页上(即,放置锁的页),我们添加一些简单的 JavaScript。

  1. < script language="javascript"> 
  2. //如果用户关闭浏览器或点击“后退”按钮,  
  3. //确保该文档会被解除锁定  
  4. window.onbeforeunload = ReleaseLock;  
  5. function ReleaseLock() {  
  6. Locker.ReleaseDocument(< %=DocumentID%>);  
  7. }  
  8. < /script> 

在这里,DocumentId 是在后面的代码中定义和设置的变量。另外,我们可以在会话中存储 DocumentId,并在服务器端 ReleaseDocument 中访问。通常,ReleaseDocument 从锁定的文档列表中删除文档。

以上就是ASP.NET AJAX示例:文档锁定程序的实现。

【编辑推荐】

  1. ASP.NET AJAX示例:下拉列表
  2. AJAX.NET安装配置全指南
  3. Ajax.Net快速入门
  4. ASP.NET AJAX软件下载
  5. ASP.NET之父强烈推荐:ASP.NET AJAX著作
责任编辑:yangsai 来源: MSDN
相关推荐

2009-08-07 16:09:25

ASP.NET AJA

2009-08-07 16:39:08

ASP.NET AJA

2009-07-22 16:17:39

ASP.NET AJA

2009-07-24 13:41:15

ASP.NET AJA

2009-07-22 16:11:43

ASP.NET AJA

2009-07-22 16:25:41

ASP.NET AJA

2009-07-22 16:05:34

ASP.NET AJA

2009-07-31 13:24:43

ASP.NET AJA

2009-07-22 15:58:52

ASP.NET AJA

2009-07-29 13:50:26

UpdatePanelASP.NET

2009-07-20 10:16:13

配置ASP.NET A

2009-07-28 09:02:32

asp.net aja

2009-07-21 17:18:26

UpdateProgrASP.NET AJA

2009-07-29 15:53:22

ASP.NET AJA

2009-07-20 13:14:25

安装ASP.NET A

2009-07-20 13:54:31

ScriptManagASP.NET AJA

2009-07-20 17:39:36

WCF服务ASP.NET AJA

2009-07-31 10:34:41

ASP.NET抓取网页

2009-07-24 17:31:56

ASP.NET AJA

2009-07-21 09:53:55

ASP.NET AJAWCF服务
点赞
收藏

51CTO技术栈公众号