程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 怎樣在前端Javascript中調用C#方法(1)簡單實現(附源碼)

怎樣在前端Javascript中調用C#方法(1)簡單實現(附源碼)

編輯:C#入門知識

相信不少朋友在剛接觸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 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved