五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現在的位置: 365建站網 > 365文章 > 應用HttpHandler, Json, JQuery, ASP.Net UserControl等技術處理 Ajax 的

應用HttpHandler, Json, JQuery, ASP.Net UserControl等技術處理 Ajax 的

文章來源:365jz.com     點擊數:1418    更新時間:2009-09-15 10:03   參與評論
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代碼的話

<div id="test"></div>

則我們可以編寫如下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單純的作為模板來用。

如對本文有疑問,請?zhí)峤坏浇涣髡搲瑥V大熱心網友會為你解答??! 點擊進入論壇

發(fā)表評論 (1418人查看0條評論)
請自覺遵守互聯網相關的政策法規(guī),嚴禁發(fā)布色情、暴力、反動的言論。
昵稱:
最新評論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學習

業(yè)務咨詢

· 技術支持
· 服務時間:9:00-18:00
365建站網二維碼

Powered by 365建站網 RSS地圖 HTML地圖

copyright © 2013-2024 版權所有 鄂ICP備17013400號