zoukankan      html  css  js  c++  java
  • ASP.NET and Ajax using XmlHttpRequest

    1. 使用AJAX
    If you are not interested in using the ASP.NET AJAX library offered for ASP.NET, but would like to feature small amounts of AJAX functionality on your pages, you can do this easily with some javascript and a receptive page.

    UPDATE: A much simpler way to add small doses of AJAX fuctionality to ASP.NET Web Forms can be achieved by using jQuery. Please see this article: http://www.mikesdotnetting.com/Article/104/Many-ways-to-communicate-with-your-database-using-jQuery-AJAX-and-ASP.NET

    I only use AJAX in small doses on web sites - mainly to improve the user-experience. Typical instances will involve retrieving a full record based on a users sleection in a drop down list. I don't want to perform a full page postback, so I get the javascript xmlhttpserver object to do it for me behind the scenes. Here's an example that fetches the address details for a Northwind Traders customer.

    First, a generic function to instantiate an instance of xmlhttprequest or xmlhttp, depending on the browser:

      function GetXmlHttpObject(handler)
      { 
      var objXmlHttp=null
      if (navigator.userAgent.indexOf("MSIE")>=0)
      { 
      var strName="Msxml2.XMLHTTP"
      if (navigator.appVersion.indexOf("MSIE 5.5")>=0)
      {
      strName="Microsoft.XMLHTTP"
      } 
      try
      { 
      objXmlHttp=new ActiveXObject(strName)
      objXmlHttp.onreadystatechange=handler 
      return objXmlHttp
      } 
      catch(e)
      { 
      alert("Error. Scripting for ActiveX might be disabled") 
      return 
      } 
      } 
      if (navigator.userAgent.indexOf("Mozilla")>=0)
      {
      objXmlHttp=new XMLHttpRequest()
      objXmlHttp.onload=handler
      objXmlHttp.onerror=handler 
      return objXmlHttp
      }
      } 
    

    Now, a simple dropdownlist populated by a SqlDataSource control that fetches the CustomerID and Customer Name. Note the empty div, CustomerDetails below the dropdownlist:

    <div>
    <asp:DropDownList ID="DropDownList1" 
    runat="server" 
    DataSourceID="SqlDataSource1"
    DataTextField="CompanyName" 
    DataValueField="CustomerID">
    </asp:DropDownList>
    
    <asp:SqlDataSource 
    ID="SqlDataSource1" 
    runat="server" 
    ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|Northwind.mdb"
    DataSourceMode="DataReader" 
    ProviderName="System.Data.OleDb"
    SelectCommand="SELECT [CustomerID], [CompanyName] FROM [Customers]">
    </asp:SqlDataSource>
    
    </div>
    <div id="CustomerDetails"></div>
    

    Two more javascript functions are needed. One to fire the GetXmlHttpObject method, and denote the page to send a request to, and one to handle the response by checking the readtState property of the object for a value of 4 or complete, then to write the reponse to the empty div:

      function GetCustomer(id)
      { 
      var url="FetchCustomer.aspx?CustomerID=" + id ;
      xmlHttp=GetXmlHttpObject(stateChanged);
      xmlHttp.open("GET", url , true);
      xmlHttp.send(null);
      } 
      
      
      function stateChanged() 
      { 
      if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
      {
      document.getElementById('CustomerDetails').innerHTML=xmlHttp.responseText;
      }
      } 
    

    So now we have a page that gets called by xmlhttp (FetchCustomer.aspx) and we have a value to pass to the querystring for the page. So the next thing to do is to add an event handler to the DropDownList that will fire the GetCustomer() event and pass a CustomerID value:

      if (!Page.IsPostBack)
      {
      DropDownList1.DataBind();
      DropDownList1.Items.Insert(0, "");
      }
    
      DropDownList1.Attributes["onChange"] = "GetCustomer(this.value);";
      HttpResponse myHttpResponse = Response;
      HtmlTextWriter myHtmlTextWriter = new HtmlTextWriter(myHttpResponse.Output);
      DropDownList1.Attributes.AddAttributes(myHtmlTextWriter);
    

    And finally, the code for the FetchCustomer.aspx page. Everyting has been removed from the .aspx file except the first line. We don't want DocTypes or default <form> tags disturbing the piece of html to be emitted in the response:

    <%@ Page Language="C#" AutoEventWireup="true" 
    CodeFile="FetchCustomer.aspx.cs" Inherits="FetchCustomer" %>
    

    And the code-behind makes doubly sure by calling Response.Clear() before querying the database and emitting the resulting data as html:

    using System;
    using System.Data;
    using System.Data.OleDb;
    using System.Text;
    
    public partial class FetchCustomer : System.Web.UI.Page
    {
      protected void Page_Load(object sender, EventArgs e)
      {
        Response.Clear();
        StringBuilder sb = new StringBuilder();
        sb.Append("<br />");
        string provider = "Provider=Microsoft.Jet.OLEDB.4.0;";
        string db = "Data Source=|DataDirectory|Northwind.mdb";
        string connstr = provider + db;
        string query = "SELECT * FROM Customers WHERE CustomerID = ?";
        OleDbConnection conn = new OleDbConnection(connstr);
        OleDbCommand cmd = new OleDbCommand(query, conn);
        cmd.Parameters.AddWithValue("", Request.QueryString["CustomerID"]);
        conn.Open();
        OleDbDataReader dr = cmd.ExecuteReader();
        while(dr.Read())
        {
          sb.Append(dr[1].ToString() + "<br />");
          sb.Append(dr[4].ToString() + "<br />");
          sb.Append(dr[5].ToString() + "<br />");
          sb.Append(dr[6].ToString() + "<br />");
          sb.Append(dr[7].ToString() + "<br />");
          sb.Append(dr[8].ToString() + "<br />");
          sb.Append("Tel: " + dr[9].ToString() + "<br />");
        } 
        dr.Close();
        dr.Dispose();
        conn.Close();
        conn.Dispose();
        Response.Write(sb.ToString())
        Response.End();
      }
    }
    
    2. ASP.Net集成的方案
    http://www.asp.net/web-forms/tutorials/aspnet-ajax/understanding-partial-page-updates-with-asp-net-ajax

  • 相关阅读:
    【GIT-精讲】从零玩转Git-基础理论
    【fmjava】 面试题突击训练-Java基础语法篇01
    【笔记】springSecurity-OAuth2.0-授权模式演示
    【难受】SpirngCloud-Alibaba-nacos跨服务器访问接口的问题
    Python编程题汇总(持续更新中……)
    Python编程题14--随机分配礼物
    Python编程题13--判断两个升序列表,其中一个是另外一个的子集
    Python编程题12--列表中比前面元素都大,比后面元素都小的数
    Python编程题11--找出100以内的质数
    Python编程题10--找出和为N的两个数
  • 原文地址:https://www.cnblogs.com/blackbean/p/2966070.html
Copyright © 2011-2022 走看看