相信不少朋友在剛接觸WebForm編程的時候都有過這樣的想法,為什麼在.aspx頁面的Javascript中不能直接調用到.aspx.cs文件中的方法?這篇文章所介紹的內容與這個問題有點關系,但並沒有真正的解決Javascript直接調用C#的方法這個問題,只是通過其它的方式讓我們前端與後端的交互實現起來能更簡單些,介紹的內容是本人在實際的開發過程中累積的一點點心得,分享出來,不對的地方或有更好的實現,大家不妨拿出來一起交流。
Ajax這個東西就不用我過多的介紹了,相信大家可能比我了解的還要多,當有一些靜態(或偽靜態)頁面中有部分數據需要動態更新時,Ajax就用得比較多了,處理Ajax請求的方法也有很多種,有的朋友直接新建一個.aspx頁面,然後在.aspx.cs文件中Response.Write,有的朋友則喜歡用.ashx文件來處理,也有的朋友喜歡用IHttpHandler。文章中使用的就是IHttpHandler。
一般需要動態輸出的內容或多或少會跟業務邏輯有些關聯,所以在示例中代碼是分了兩個項目,Web項目只負責數據的展示,Biz項目負責邏輯的處理。演示的代碼僅作為簡單示例,實際開發項目中的代碼可能會有很大的差異。
下面進入正題,說說我們要實現的內容。
在html頁面中我們可以通過指定規則的鏈接直接訪問到Biz項目中的某個類的指定方法。
如請求/Ajax/News/GetNewsHits.aspx,則我們可以調用到Biz項目中的News類裡的GetNewsHits方法。
既然大家都知道直接調用是不可能實現的了,那我們肯定需要一個代理來幫我們完成中間的過程。
首先,我們先在Web項目的根目錄下建立一個Ajax文件夾,並在裡面添加一個web.config文件。代碼如下:
View Code
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings/>
<connectionStrings/>
<system.web>
<httpHandlers>
<add path="*.aspx" validate="false" type="Biz.Factory" verb="*"/>
</httpHandlers>
</system.web>
<system.webServer>
<handlers>
<add name="AjaxRequestFactory" path="*.aspx" type="Biz.Factory" verb="*"/>
</handlers>
</system.webServer>
</configuration>
這段代碼表示Ajax文件夾下所有的aspx文件請求都交給“Biz.Factory”類來處理。
然後我們在Biz項目中加入類“Factory”,也就是我們的代理類,由它來負責將請求轉接到指定的方法,並實現IHttpHandler接口。代碼如下:
View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
namespace Biz {
public class Factory : IHttpHandler {
public bool IsReusable {
get {
return true;
}
}
public void ProcessRequest(HttpContext context) {
Execute(context);
}
void Execute(HttpContext context) {
//根據請求的Url,通過反射取得處理該請求的類
string url = context.Request.Url.AbsolutePath;
string[] array = url.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
string typename = "Biz";
for (int x = 1; x < array.Length - 1; x++) {
typename += "." + array[x];
}
Type type = this.GetType().Assembly.GetType(typename, false, true);
if (type != null) {
//取得類的無參數構造函數
var constructor = type.GetConstructor(new Type[0]);
//調用構造函數取得類的實例
var obj = constructor.Invoke(null);
//查找請求的方法
var method = type.GetMethod(System.IO.Path.GetFileNameWithoutExtension(url));
if (method != null) {
//執行方法並輸出響應結果
context.Response.Write(method.Invoke(obj, null));
}
}
}
}
}
當然,我們還需要一個用來做演示的被調用的類News:
View Code
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace Biz {
7 public class News {
8 static int _value;
9 public int GetNewsHits() {
10 return ++_value;
11 }
12 }
13 }
最後回到web項目中新建一個html文件,代碼很簡單,ajax就不重復敲代碼了,直接用jquery裡相關的方法:
View Code
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script language="javascript" type="text/javascript" src="Scripts/jquery-1.4.1.min.js"></script>
<script language="javascript" type="text/javascript">
$(function () {
//綁定按鈕點擊事件
$("input:button").click(function () {
$.post("/Ajax/News/GetNewsHits.aspx", null, function (txt) {
$("div").text(txt);
}, "text");
});
});
</script>
</head>
<body>
<div style="font-size:24px;font-weight:bold;width:100px;line-height:35px;text-align:center;">0</div>
<input type="button" value="獲取點擊次數" />
</body>
</html>
所有代碼准備完成,實際上代碼沒幾行,Biz項目中的類及方法可以隨意添加,只需要更改調用的鏈接即可。
附示例代碼下載:點擊下載
http://www.BkJia.com/uploadfile/2012/0308/20120308082911918.zip
示例代碼說明:
1.需要運行項目才能看到演示效果。
2.每點擊一次按鈕服務端的變量就回累加1並返回。
3.您也可以在Biz.News類中加入另一個方法進行測試,當然調用鏈接中的GetNewsHits要修改成您對應的方法名。
4.您也可以在Biz項目中加入一個新的類來測試,條件是新的類必須有無參數構造函數。
未完待續...
摘自 狼Robot