介绍ASP.NET MVC中的MvcAjaxPanel |
本文标签:MvcAjaxPanel ASP.NET MVC 也有评论认为,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的做法 。
很明显,MvcAjaxPanel的工作原理与UpdatePanel有颇多相似之处,也做到了一定程度上的透明 。而且与Nikhil的解决方案相比,一个非常重要的优势就是可以一次更新页面中的多个区域——其实这也就是UpdatePanel的特性之一 。而且这种对Controller透明的做法又有一个天然的特点,那就是能够轻松地在不支持AJAX的浏览器中使用传统的方式切换页面 。 |