2008-09-17 17 views
5

第一次使用.NET中的UpdatePanels。AJAX - 如何將值傳遞迴服務器

我有一個觸發器指向FormView控件上的事件的updatepanel。 UpdatePanel包含來自單獨數據庫的相關數據的ListView。

當UpdatePanel刷新時,它需要來自FormView控件的值,以便在服務器上它可以使用它們來查詢數據庫。

對於生活如果我,我不知道如何獲得這些價值觀。我觸發的事件有他們,但我想要updatepanel異步刷新。如何將值傳遞給面板上的加載事件?

谷歌搜索這個廣告nauseum,似乎無法得到一個答案。鏈接或解釋將是巨大的幫助..

傑夫

回答

4

做一個JavaScript函數,它將收集表單數據,然後將該數據發送到ASHX處理程序。 ASHX處理程序將執行一些工作,並可以回覆答覆。

這是我調用數據庫來使用AJAX調用填充網格的一個示例。有更好的圖書館做AJAX(原型,ExtJS等),但這是原始交易。 (我知道這可以重構是更清潔的,但你可以得到的想法不夠好)

是這樣的......

  • 用戶輸入文本的搜索框中,
  • 用戶點擊搜索按鈕,
  • 的JavaScript獲取表單數據,
  • 的JavaScript使AJAX調用,以ASHX,
  • ASHX接收請求,
  • ASHX查詢數據庫,
  • ASHX將響應解析爲JSON/Javascript數組,
  • ASHX發送響應,
  • 的Javascript接收響應,
  • 的JavaScript的eval()的響應對象,
  • JavaScript的迭代對象的屬性和填充網格

的HTML看起來像這樣...

<html xmlns="http://www.w3.org/1999/xhtml" > 
<head runat="server"> 
    <title>Untitled Page</title> 
    <script type="text/javascript" src="AjaxHelper.js"></script> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:TextBox ID="txtSearchValue" runat="server"></asp:TextBox> 
     <input id="btnSearch" type="button" value="Search by partial full name" onclick="doSearch()"/> 

     <igtbl:ultrawebgrid id="uwgUsers" runat="server" 
//infragistics grid crap 
      </igtbl:ultrawebgrid>--%> 
    </div> 
    </form> 
</body> 
</html> 

的腳本上點擊火災看起來就像這樣......

//this is tied to the button click. It takes care of input cleanup and calling the AJAX method 
function doSearch(){ 
    var eleVal; 
    var eleBtn; 
    eleVal = document.getElementById('txtSearchValue').value; 
    eleBtn = document.getElementById('btnSearch'); 
    eleVal = trim(eleVal); 
    if (eleVal.length > 0) { 
     eleBtn.value = 'Searching...'; 
     eleBtn.disabled = true; 
     refreshGridData(eleVal); 
    } 
    else { 
     alert("Please enter a value to search with. Unabated searches are not permitted."); 
    } 
} 

//This is the function that will go out and get the data and call load the Grid on AJAX call 
//return. 
function refreshGridData(searchString){ 

    if (searchString =='undefined'){ 
     searchString = ""; 
    } 

    var xhr; 
    var gridData; 
    var url; 

    url = "DefaultHandler.ashx?partialUserFullName=" + escape(searchString); 
    xhr = GetXMLHttpRequestObject(); 

    xhr.onreadystatechange = function() { 
     if (xhr.readystate==4) { 
      gridData = eval(xhr.responseText); 
      if (gridData.length > 0) { 
       //clear and fill the grid 
       clearAndPopulateGrid(gridData); 
      } 
      else { 
       //display appropriate message 
      } 
     } //if (xhr.readystate==4) { 
    } //xhr.onreadystatechange = function() { 

    xhr.open("GET", url, true); 
    xhr.send(null); 
} 

//this does the grid clearing and population, and enables the search button when complete. 
function clearAndPopulateGrid(jsonObject) { 

    var grid = igtbl_getGridById('uwgUsers'); 
    var eleBtn; 
    eleBtn = document.getElementById('btnSearch'); 

    //clear the rows 
    for (x = grid.Rows.length; x >= 0; x--) { 
     grid.Rows.remove(x, false); 
    } 

    //add the new ones 
    for (x = 0; x < jsonObject.length; x++) { 
     var newRow = igtbl_addNew(grid.Id, 0, false, false); 
     //the cells should not be referenced by index value, so a name lookup should be implemented 
     newRow.getCell(0).setValue(jsonObject[x][1]); 
     newRow.getCell(1).setValue(jsonObject[x][2]); 
     newRow.getCell(2).setValue(jsonObject[x][3]); 
    } 

    grid = null; 

    eleBtn.disabled = false; 
    eleBtn.value = "Search by partial full name"; 
} 


// this function will return the XMLHttpRequest Object for the current browser 
function GetXMLHttpRequestObject() { 

    var XHR; //the object to return 
    var ua = navigator.userAgent.toLowerCase(); //gets the useragent text 
    try 
    { 
     //determine the browser type 
     if (!window.ActiveXObject) 
     { //Non IE Browsers 
      XHR = new XMLHttpRequest(); 
     } 
     else 
     { 
      if (ua.indexOf('msie 5') == -1) 
      { //IE 5.x 
       XHR = new ActiveXObject("Msxml2.XMLHTTP"); 
      } 
      else 
      { //IE 6.x and up 
       XHR = new ActiveXObject("Microsoft.XMLHTTP"); 
      } 
     } //end if (!window.ActiveXObject) 

     if (XHR == null) 
     { 
      throw "Unable to instantiate the XMLHTTPRequest object."; 
     } 
    } 
    catch (e) 
    { 
     alert("This browser does not appear to support AJAX functionality. error: " + e.name 
       + " description: " + e.message); 
    } 
    return XHR; 
} //end function GetXMLHttpRequestObject() 

function trim(stringToTrim){ 
    return stringToTrim.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); 
} 

而且ashx的處理程序是這樣的....

Imports System.Web 
Imports System.Web.Services 
Imports System.Data 
Imports System.Data.SqlClient 

Public Class DefaultHandler 
    Implements System.Web.IHttpHandler 

    Private Const CONN_STRING As String = "Data Source=;Initial Catalog=;User ID=;Password=;" 

    Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest 

     context.Response.ContentType = "text/plain" 
     context.Response.Expires = -1 

     Dim strPartialUserName As String 
     Dim strReturnValue As String = String.Empty 

     If context.Request.QueryString("partialUserFullName") Is Nothing = False Then 
      strPartialUserName = context.Request.QueryString("partialUserFullName").ToString() 

      If String.IsNullOrEmpty(strPartialUserName) = False Then 
       strReturnValue = SearchAndReturnJSResult(strPartialUserName) 
      End If 
     End If 

     context.Response.Write(strReturnValue) 

    End Sub 


    Private Function SearchAndReturnJSResult(ByVal partialUserName As String) As String 

     Dim strReturnValue As New StringBuilder() 
     Dim conn As SqlConnection 
     Dim strSQL As New StringBuilder() 
     Dim objParam As SqlParameter 
     Dim da As SqlDataAdapter 
     Dim ds As New DataSet() 
     Dim dr As DataRow 

     'define sql 
     strSQL.Append(" SELECT ") 
     strSQL.Append("  [id] ") 
     strSQL.Append("  ,([first_name] + ' ' + [last_name]) ") 
     strSQL.Append("  ,[email] ") 
     strSQL.Append(" FROM [person] (NOLOCK) ") 
     strSQL.Append(" WHERE [last_name] LIKE @lastName") 

     'clean up the partial user name for use in a like search 
     If partialUserName.EndsWith("%", StringComparison.InvariantCultureIgnoreCase) = False Then 
      partialUserName = partialUserName & "%" 
     End If 

     If partialUserName.StartsWith("%", StringComparison.InvariantCultureIgnoreCase) = False Then 
      partialUserName = partialUserName.Insert(0, "%") 
     End If 

     'create the oledb parameter... parameterized queries perform far better on repeatable 
     'operations 
     objParam = New SqlParameter("@lastName", SqlDbType.VarChar, 100) 
     objParam.Value = partialUserName 

     conn = New SqlConnection(CONN_STRING) 
     da = New SqlDataAdapter(strSQL.ToString(), conn) 
     da.SelectCommand.Parameters.Add(objParam) 

     Try 'to get a dataset. 
      da.Fill(ds) 
     Catch sqlex As SqlException 
      'Throw an appropriate exception if you can add details that will help understand the problem. 
      Throw New DataException("Unable to retrieve the results from the user search.", sqlex) 
     Finally 
      If conn.State = ConnectionState.Open Then 
       conn.Close() 
      End If 
      conn.Dispose() 
      da.Dispose() 
     End Try 

     'make sure we have a return value 
     If ds Is Nothing OrElse ds.Tables(0) Is Nothing OrElse ds.Tables(0).Rows.Count <= 0 Then 
      Return String.Empty 
     End If 

     'This converts the table into JS array. 
     strReturnValue.Append("[") 

     For Each dr In ds.Tables(0).Rows 
      strReturnValue.Append("['" & CStr(dr("username")) & "','" & CStr(dr("userfullname")) & "','" & CStr(dr("useremail")) & "'],") 
     Next 

     strReturnValue.Remove(strReturnValue.Length - 1, 1) 
     strReturnValue.Append("]") 

     'de-allocate what can be deallocated. Setting to Nothing for smaller types may 
     'incur performance hit because of a forced allocation to nothing before they are deallocated 
     'by garbage collection. 
     ds.Dispose() 
     strSQL.Length = 0 

     Return strReturnValue.ToString() 

    End Function 


    ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable 
     Get 
      Return False 
     End Get 
    End Property 

End Class 
1

嘗試

  • ...看在請求和響應 。
  • ...設定的負載()方法中設置斷點 和查詢Me或 這在手錶或立即 窗口,看看你想 的值也許只是沒有你在哪裏 期待呢?
  • ...把​​(對於每個ctl作爲控制在Me/This.Controls中) 並檢查每個迭代的控件,看看你是否獲得了你期望的控件。
  • ...它不在Sender或EventArgs中?

嘗試不使用更新面板....他們往往會造成比他們的價值更多的麻煩。使用普通的AJAX來完成它可能會更快,也更麻煩。

1

如果您正在使用UpdatePanel,只需確保兩個控件位於面板內部並且它將按需要工作。

+0

米切爾,這將是個好消息。我做了你的建議,但我仍然不清楚如何在面板的加載事件中看到我需要的值。你能告訴我更多嗎? – jlembke 2008-09-17 18:27:17