2008-09-17 11 views
5

Pierwsza praca z UpdatePanels w .NET.AJAX - przekazywanie wartości z powrotem do serwera

Mam aktualizację z wyzwalaczem wskazującym na zdarzenie w formantu FormView. UpdatePanel przechowuje ListView z powiązanymi danymi z oddzielnej bazy danych.

Gdy UpdatePanel odświeża, potrzebuje wartości z formantu FormView, aby na serwerze mógł ich użyć do wysłania zapytania do bazy danych.

Za życie, jeśli ja, nie mogę wymyślić, jak uzyskać te wartości. Zdarzenie, z którego uruchamiam, ma je, ale chcę, aby updatepanel był odświeżany asynchronicznie. Jak przekazać wartości do zdarzenia obciążenia na panelu?

Zatwierdził tę reklamę na muzeum i nie może znaleźć odpowiedzi tutaj. Link lub wyjaśnienie byłoby niezmiernie pomocny ..

Jeff

Odpowiedz

4

utworzyć funkcję javascript, która będzie zbierać kawałki danych formularza, a następnie wysyła te dane do obsługi ASHX. program obsługi ASHX wykona pewną pracę i może odpowiedzieć z odpowiedzią.

Oto przykład, który wykonałem, który wywołuje bazę danych w celu zapełnienia siatki przy użyciu wywołań AJAX. Są lepsze biblioteki do robienia AJAX (prototyp, ExtJS, itp.), Ale jest to surowa umowa. (I wiedzieć można to refactored być jeszcze czystsze, ale może masz pomysł na tyle dobrze)

działa tak ...

  • użytkownik wprowadza tekst w polu wyszukiwania,
  • Użytkownik kliknie przycisk wyszukiwania,
  • JavaScript pobiera dane z formularza,
  • javascript sprawia wywołanie ajax do ashx,
  • ashx odbiera żądanie,
  • Baza zapytań ASHX,
  • ASHX analizuje odpowiedź na tablicę JSON/Javascript,
  • Ashx wysyła odpowiedź,
  • JavaScript otrzymuje odpowiedź,
  • JavaScript eval() 's odpowiedź na sprzeciw,
  • javascript iteracje właściwości obiektów i wypełnia siatkę

HTML będzie wyglądać następująco ...

<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> 

skrypt odpala na kliknięcie będzie wyglądać następująco ...

//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*$/, ''); 
} 

I obsługi ashx wygląda tak ....

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

Spróbuj

  • ... patrząc na życzenie i Response.
  • ... ustawienie punktu przerwania z metody load() i zapytań Me lub to w zegarku lub bezpośrednim okna, aby zobaczyć, czy żądane wartości to może po prostu nie gdzie jesteś je spodziewa?
  • ... Umieść (dla każdego ctl jako Kontrola we mnie/This.Controls) i sprawdź każdy kontrolowany element, który jest iterowany i sprawdź, czy otrzymujesz nawet wymagane elementy sterujące.
  • ... nie jest w Nadawcy ani w Zdarzeniu?

NIE używaj Paneli aktualizacji .... Często mogą powodować więcej problemów niż są warte. Może być szybszy i mniej bóle głowy, aby użyć zwykłej AJAX, aby to zrobić.

1

Jeśli pracujesz z UpdatePanel, upewnij się, że oba elementy sterujące znajdują się wewnątrz panelu i będą działać zgodnie z oczekiwaniami.

+0

Mitchel, że byłoby to dobre wieści. Zrobiłem to, co zasugerowałeś, ale nadal nie jestem pewien, w jaki sposób mogę zobaczyć wartości, których potrzebuję w zdarzeniu ładowania dla panelu. Możesz powiedzieć mi więcej? – jlembke