快速业务通道

UpdatePanel for ASP.NET MVC的尝试

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20
Panel">
<% Ajax.Initialize(); %>
<% this.RenderBeginAjaxForm(
   Url.Action ("CompleteTask"),
   new {
     Update = "taskItem" + Task.ID,
     UpdateType = "replace",
     Completed = "endUpdateTask"}); %>
  <input type="hidden" name="taskID" value="<%= Task.ID %>" />
  <input type="submit" class="completeButton" name="completeTask" value="Done!" />
  <input type="submit" class="deleteButton" name="deleteTask" value="Delete" />
   <span><%= Html.Encode(Task.Name) %></span>
<% this.RenderEndForm(); %>
<% Ajax.RenderScripts(); %>
</div>

这些辅助方法的作用是生成一些触发AJAX更新的 标签及脚本,当用户点击RenderBeginAjaxForm与RenderEndForm方法生成的tag之 间的提交按钮时,网页将会向服务器端发出一个AJAX请求,而服务器端的Action 并最终会通过RenderPartial方法输出一个Partial Template生成的HTML。服务器 端最终输出的HTML将会被替换或添加到页面的某个元素内。这就形成了一个AJAX 效果。这个解决方案从某些方面看上去很酷,尤其是生成的代码可以添加到某个 元素中,而不单单是如同UpdatePanel的替换,例如Nikhil在他的例子中就使用了 这个特性实现了一个添加功能。不过如果使用之前提出的原则来衡量的话,似乎 这个解决方案并不十分理想。

原因很简单,因为不够透明。

也有 评论认为,Controller中的逻辑不该根据一个请求AJAX与否而进行不同处理 (Nikhil的解决方案使用RenderPartial来替代RenderView为AJAX操作进行输出) ,因此这个解决方案破坏了MVC的职责。我不这么认为,但是我希望能做到这一点 ,因为做到这一点即意味着绝对的透明。绝对透明则意味着Controller将一个应 用程序是否AJAX的决定权完全交给了客户端,这点非常理想,因为AJAX完全是一 个表现层的概念。ASP.NET AJAX中的UpdatePanel在这方面的表现可圈可点(虽然 还远不够完美),因此我最后决定也为ASP.NET MVC开发一款类似UpdatePanel的 组件。值得庆幸的是,ASP.NET MVC默认使用WebForm页面作为视图模板,在这个 强大的模型之下,构建出这样一个AJAX解决方案(的原形)似乎并不十分困难。

我将这个控件命名为MvcAjaxPanel。MvcAjaxPanel与UpdatePanel最大的 区别在于后者接收的是PostBack,而前者接收的只是普通的HTTP请求。 Post“Back”意味着Post过后回到了原来的Page,而ASP.NET MVC的请 求往往会被引导至不同的页面。因此如何跨页面进行内容更新是MvcAjaxPanel首 要解决的问题。最终我选择了为每个MvcAjaxPanel指定一个UpdateAreaID的做法 。

<mvc:MvcAjaxPanel runat="server" ID="mvcAjaxPanel" UpdateAreaID="Header">
   ...
</mvc:MvcAjaxPanel>

当页面向服务器端发出 一个AJAX请求时将会附带页面中的UpdateAreaID信息,而服务器端的Action并不 会意识到这一点,因此依旧按照寻常逻辑指定一个视图模版并输出HTML。不过, 如果视图模板中的MvcAjaxPanel发现这个请求实际上是一个符合约定的AJAX请求 (请注意,只有View组件意识到这是个请求的性质),则会使用新的方法来替换 标准的输出。这时候模板就会根据客户端传递过来的UpdateAreaID,寻找页面上 具有同样属性值的MvcAjaxPanel,有选择性地输出内容。在客户端就会有对应的 JavaScript代码接收服务器

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号