HttpHandler, Json, JQuery, ASP.Net UserControl各部分相應的作用如下,
-
HttpHandler:相應客戶請求,并通過調用service返回相應數據。
-
Json:用來傳輸簡單數據的數據格式。
-
JQuery:通過JQuery的API調用Ajax,修改頁面數據、樣式等。
-
UserControl:生成復雜的html數據,并回傳給客戶端。
一、頁面請求部分
頁面請求部分通過JQuery的Ajax API向HttpHandler發(fā)出request,有post和get兩種方式。
JQuery調用的簡單代碼如下
var showData = function() {
var httpHandler = "httphandler.ashx"; // request URL
var params = { "name": "test" }; // parameters
var type = "json"; // type, "xml", "html", "script", "json", "jsonp", "text".
var callBack = function(data, status) { // call back function
alert(data.toString());
}
$.get(httpHandler, params, callBack, "json");
自己寫的一個小工具函數,類似于c#的String.format();
var formatString = function(inputStr, parameters) {
for (var i = 0; i < parameters.length; i++) {
inputStr = inputStr.replace("{" + i + "}", parameters[i]);
}
return inputStr;
}
這樣就可以簡單的封裝請求,
var httpHandler = formatString( "httphandler.ashx?name={0}",["test"]);
二、HttpHandler響應
HttpHandler用來響應browser發(fā)送的request,它通過params接收request請求的參數,然后調用相應的service處理請求,最終返回數據給客戶端。
對于如何調用service的方法,我是通過反射的方式去實現的,當然,反射勢必會影響一定的效率,這里也可以考慮用Emit實現。
string name = context.Request.Params["name"]; // request params, just like id and name etc.
string type = context.Request.Params["type"]; // which type to response
string methodName = context.Request.Params["methodName"]; // get the method name to invoke
Service service = new Service();
object obj = service.GetType().InvokeMember(
methodName,
System.Reflection.BindingFlags.InvokeMethod,
null,
service,
new object[]
{ name } //here it the method parameters
);
Service返回的數據,若回傳到客戶端之后,根據客戶端生成html的難度一般可以將回傳數據分為兩種形式,
- 將service返回的實體或者DataTable生成Json,然后輸出到客戶端
- 先通過UserControl直接生成Html,然后輸出到客戶端(這種方式有可以充分利用UserControl的優(yōu)勢,可視化編輯和WebForm的服務器端控件)
兩種形式都比較簡單,生成Json可以使用Json.net,它提供了將實體類和DataTable直接序列化成Json的方式。
至于通過UserControl生成Html,可以用以下代碼實現,
public class ViewManager<T> where T : UserControl
{
private Page pageHolder;
public T LoadUserControl(string path)
{
this.pageHolder = new Page();
return (T)this.pageHolder.LoadControl(path);
}
public string RenderView(T control)
{
StringWriter writter = new StringWriter();
this.pageHolder.Controls.Add(control);
HttpContext.Current.Server.Execute(this.pageHolder, writter, false);
return writter.ToString();
}
}
HttpHandler 中將UserControl生成的html輸出到客戶端的代碼如下,
ViewManager<UserControl> manager = new ViewManager<UserControl>();
UserControl control = manager.LoadUserControl("~/Controls/UserControl.ascx");
context.Response.ContentType = "text/plain";
context.Response.Write(manager.RenderView(control));
如果,你對如何通過UserControl生成Html代碼感興趣的話,可以查看老趙的這篇文章,http://www.cnblogs.com/JeffreyZhao/archive/2008/07/14/1241979.html
三、編寫callback函數處理HttpHandler回傳的數據
數據回傳到客戶端之后,可以通過回調函數處理HttpHandler回傳的數據,然后將該數據生成的html代碼加載到頁面上。
回調函數就是第一部分中的編寫的callback函數。
var callBack = function(data, status)
{ // call back function
alert(data.toString());
}
假設頁面有如下代碼,而回傳的數據是html代碼的話
則我們可以編寫如下JavaScript,用來增加div中的內容。
var callBack = function(data, status) { // call back function
$("#test").html(data);
}
如果回傳數據是json,而我們想通過該json生成table的話,也可以寫一個通用的函數,專門用來生成table的html,然后將該table的html加載到頁面上。
var writeTable = function(jsonData) {
if (jsonData.length > 0) {
var content = "<table cellpadding=\"5\" cellspacing=\"0\"><thead class=\"thead\"><tr>";
for (var key in jsonData[0])
{ content += "<td>" + key + "</td>"; }
content += "</thead><tbody></tr>";
$.each(jsonData, function(i) {
content += "<tr>";
for (var key in jsonData[i]) {
content += "<td>" + jsonData[i][key] + "</td>"
}
content += "</tr>";
});
content += "</tbody>";
content += "</table>";
return content;
}
}
上面就是一次完整的調用過程。
四、總結
相對于asp.net ajax的方式,通過這樣的方式作為Ajax的解決方案,個人認為有以下優(yōu)點:
- 控制性,相對于封裝好的asp.net ajax的update panel,這樣的方式無疑更容易控制。
- 靈活性,想什么時候ajax就什么時候ajax。
- 性能,這種方式帶來的性能還是有一定的提升的。
缺點也很明顯,
- 開發(fā)的難度增加了。
- 拋棄了相對來說比較完整的WebForm模型,而只是將WebForm單純的作為模板來用。