首次使用.NET中的UpdatePanels。
我有一个updatepanel,其触发器指向FormView控件上的事件。 UpdatePanel包含一个ListView,其中包含来自单独数据库的相关数据。
当UpdatePanel刷新时,它需要来自FormView控件的值,以便在服务器上它可以使用它们来查询数据库。
对于我的生活,我无法弄清楚如何获得这些价值观。我正在触发的事件有它们,但我希望updatepanel能够异步刷新。如何将值传递给面板上的load事件?
用Google搜索这个广告,似乎无法在这里找到答案。链接或解释会非常有用..
杰夫
答案 0 :(得分:4)
创建一个javascript函数,它将收集表单数据,然后将该数据发送到ASHX处理程序。 ASHX处理程序将完成一些工作,并可以回复响应。
这是我使用AJAX调用调用数据库来填充网格的示例。有更好的库来做AJAX(原型,ExtJS等),但这是原始的交易。 (我 知道 这可以重构为更清洁,但你可以很好地理解这个想法)
像这样工作......
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 :(得分:1)
尝试
不要使用更新面板....它们通常会带来比它们更值得的麻烦。使用常规AJAX来完成它可能会更快,更轻松。
答案 2 :(得分:1)
如果您正在使用UpdatePanel,请确保两个控件都在面板内,并且它将按照需要运行。