分享

AJAX 应用 - JavaScript调用C# 函数

 名字真麻烦 2010-04-19
如下图 1,在第一个 TextBox1 输入 EmployeeID,鼠标离开 TextBox1 失去焦点、触发 onBlur 事件时,会自动高速访问数据库,取得该笔记录的另外两个字段,显示在下方的两个 TextBox 中。
如下图 2,当用户输入不合理的 EmployeeID 时,会提示错误信息,并清空另外两个 TextBox 里既有的文字。
当用户输入不存在于数据表 Employees 的 EmployeeID 时,会提示错误信息,并清空另外两个 TextBox 里既有的文字。
当用户手动清空 TextBox1,鼠标离开 TextBox1 失去焦点、触发 onBlur 事件时,会清空另外两个 TextBox 里既有的文字。
1.jpg
图 1 网站项目中常用到的功能。以本示例的做法,不论网页上有多少个 TextBox 需要此功能,都不会相互干扰

图 2 输入不合理或错误类型的 EmployeeID,JavaScript 接收到 C# 返回的錯誤信息


关键代码如下:

Default.aspx.cs
  1. public partial class _Default : System.Web.UI.Page
  2. {
  3.     protected void Page_Load(object sender, EventArgs e)
  4.     {
  5.         //设置 TextBox 的 OnBlur 事件被触发时,所要调用的 JavaScript 函数
  6.         this.TextBox1.Attributes["onblur"] = "getEmployeeInfo('TextBox1', 'TextBox2', 'TextBox3');";
  7.         this.TextBox4.Attributes["onblur"] = "getProductInfo('TextBox4', 'TextBox5', 'TextBox6');";

  8.         //设置在 JavaScript 文件中,所能调用的 C# 自定义类的名称
  9.         Ajax.Utility.RegisterTypeForAjax(typeof(MyClass01));
  10.     }
  11. }
复制代码
我们看到上方,透过 RegisterTypeForAjax 函数,可向 AJAX.NET 注册我们写的 C# 自定义类 MyClass01。接着 AJAX.NET 会浏览这个自定义类,里面标示有 AjaxMethodAttribute 的函数,如下方代码中的 getEmployeeInfo 和 getProductInfo 函数,我们并在这两个函数里,实际去访问数据库并取回需要的一或多个字段的值。
  1. public class MyClass01
  2. {
  3.     public static string strConnString = WebConfigurationManager.ConnectionStrings["ConnString_SqlClient"].ConnectionString;

  4.     //由 EmployeeID (如: 1, 2 ,3 , ...),去数据库取出他的 LastName、Title
  5.     [Ajax.AjaxMethod()]       //告知 Ajax 封装类,为此方法创建一个 JavaScript 代理,这样才能被客户端调用
  6.     public string getEmployeeInfo(string strEmployeeID)
  7.     {
  8.         string strResult = string.Empty;
  9.         string strSql = "SELECT LastName, Title FROM EMPLOYEES WHERE EmployeeID = @EmployeeID";

  10.         using (SqlConnection conn = new SqlConnection(strConnString))
  11.         {
  12.             conn.Open();
  13.             if (conn.State == ConnectionState.Open)
  14.             {
  15.                 using (SqlCommand cmd = new SqlCommand(strSql, conn))
  16.                 {
  17.                     cmd.Parameters.Add("@EmployeeID", SqlDbType.Int).Value = strEmployeeID.Trim();

  18.                     //若确定要捉的记录只有一笔,可加上此 ADO.NET 的「SingleRow」参数,以优化性能、节省系统资源
  19.                     using (SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.SingleRow))
  20.                     {
  21.                         if (dr.Read())
  22.                         {
  23.                             strResult = dr[0].ToString() + "§" + dr[1].ToString();
  24.                         }
  25.                     }
  26.                 }
  27.             }
  28.         }

  29.         return strResult;     //strResult = "result1§result2";   //返回值为用 "§" 字符所分割的一或多个字符串
  30.     }


  31.     //由 ProductID (如: 1, 2 ,3 , ...),去数据库取出他的 ProductName、QuantityPerUnit
  32.     [Ajax.AjaxMethod()]       //告知 Ajax 封装类,为此方法创建一个 JavaScript 代理,这样才能被客户端调用
  33.     public string getProductInfo(string strProductID)
  34.     {
  35.         //...中間略...
  36.     }

  37. } //end of class
复制代码
如下,onBlur 事件被触发时,会在 JavaScript 里调用 C# 的同名函数,并从数据库里取得返回值。
  1. //由 EmployeeID (如: 1, 2 ,3 , ...),去数据库取出他的 LastName、Title
  2. function getEmployeeInfo(TextBox1, TextBox2, TextBox3) {

  3.     //调用 App_Code 文件夹里,C# 自定义类的 getEmployeeInfo 函数
  4.     var response = MyClass01.getEmployeeInfo(document.getElementById(TextBox1).value);

  5.     //response 为从 C# 自定义类里的函数所传回来的,由一或多个 "§" 字符所组成的一个字符串
  6.     if ((response.value == null) || (response.value.length == 0)) {  //若用户输入「不合理的字符」或「无对应数据的ID号码」
  7.         alert('数据库里查无数据 !');
  8.         document.getElementById(TextBox2).value = "";
  9.         document.getElementById(TextBox3).value = "";
  10.     }
  11.     else if (response.value.length > 0) {      //若数据库里有查找到对应的数据
  12.         var strArrResult = response.value.split("§");
  13.         if (strArrResult[0].length > 0)
  14.             document.getElementById(TextBox2).value = strArrResult[0];
  15.         if (strArrResult[1].length > 0)
  16.             document.getElementById(TextBox3).value = strArrResult[1];
  17.     }
  18. }


  19. 如下,在 web.config 里添加配置,让所有 ajax/*.ashx 的请求,改由 Ajax.PageHandlerFactory 产生的 HTTP Handler 处理,而不再由默认的 System.Web.UI.PageHandlerFactory 处理程序工厂 [9] 来处理。

  20. web.config
  21. <system.web>
  22.     <httpHandlers>
  23.         <add verb="POST,GET" path="ajax/*.ashx"
  24.            type="Ajax.PageHandlerFactory, Ajax" />
  25.     </httpHandlers>
  26. </system.web>
复制代码
源码下载: 090828.zip (30.03 KB)

2.jpg (24.06 KB)

 

2.jpg

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多