其實這是一篇遲發布近2個月的文章。事實上在ASP.NET MVC Preview 2發布之 前我就已經將這篇文章的所有內容准備完畢了。當時想,就等Preview 2發布吧, 而真一旦Preview 2發布之後卻又懶得進行移植——移植了之後卻又懶 得寫文章。這一拖就是近2個月,毫無長進。可能工作等其他事情的確多了些,但 是扪心自問,也並沒有忙到不可開交。時間往往都是在點點滴滴間浪費的。唉, 可能是自視太高,越來越不願意寫一些普普通通的介紹性文章,導致可寫的東西 大大減少。不過話說回來,其實打算寫的,甚至多次說過要寫得東西也並不少, 為什麼就就是沒有動筆呢?其實還是一個“懶”字——當 年的勤奮勁兒到哪裡去了呢?
言歸正傳。先解釋一下標題,什麼是“UpdatePanel for ASP.NET MVC”呢?ASP.NET AJAX中的UpdatePanel相信大家都有所了解。可惜的是, ASP.NET MVC框架的誕生“毀滅”了大量基於PostBack的控件,首當其 沖地可能就是UpdatePanel了。如果沒有PostBack,UpdatePanel就失去了全部作 用,甚至不如一些綁定控件,至少它們還能夠用於展示。為UpdatePanel長吁短歎 之後,我們不禁又開始懷念UpdatePanel的優勢:“透明”。在 UpdatePanel的幫助下,實現AJAX操作對於開發人員幾乎完全透明。我們要做的僅 僅是將需要AJAX更新的內容用UpdatePanel包裝起來,一切都是那麼優雅。
我們能否在ASP.NET MVC中拯救UpdatePanel呢?也許是可以的吧,但這更 像是一個“不可能完成的任務”。我不是傳說中的阿湯哥,因此重新 為ASP.NET MVC量身定制一個AJAX解決方案似乎更為可行。雖然我們不會苛求一個 新生事物從誕生開始就趨向完美,但即使只是一個原型,它也必須嚴格遵守的一 些原則:
不得破壞MVC中的協議(協作,職責等等)
對開發人員盡 可能地透明
Nikhil Kothari曾經提出了他在ASP.NET MVC框架下的AJAX解 決方案。如果您還不了解他的做法,那麼我先在這裡進行一點概括。Nikhil擴展 了Controller使之支持一種Ajax操作,於是我們在代碼中就可以寫如下代碼:
public class TaskListController : AjaxController {
...
public void CompleteTask(int taskID) {
if (String.IsNullOrEmpty(Request.Form["deleteTask"]) == false) {
InvokeAction("DeleteTask");
return;
}
Task task = _taskDB.GetTask (taskID);
if (task != null) {
_taskDB.CompleteTask(task);
}
if (IsAjaxRequest) {
if (task != null) {
RenderPartial("TaskView", task);
}
}
else {
RedirectToAction ("List");
}
}
...
}
與AjaxController類似,Nikhil也為ViewPage和ViewControl提供 了一些擴展方法,因此目前在View(List.aspx)中我們就能看到如下的代碼:
<div id="taskList">
<% foreach (Task task in Tasks) { %>
<div>
<% this.RenderPartial("TaskView", task); %>
</div>
<% } %>
</div>