我正在使用ASP.NET 2.0 AJAX Extensions 1.0和AJAX Control Toolkit的v1.0.20229版本(据我所知,这是.NET 2.0 / Visual Studio 2005的最新版本)。
我的网页(aspx)在UpdatePanel上有一个DropDownList控件。在DropDownList的SelectedIndexChanged事件的处理程序中,我尝试设置会话变量。
第一次触发事件时,我收到一个Sys.WebForms.PageRequestManagerParserErrorException:“无法解析从服务器收到的消息”。如果我继续,后续的SelectedIndexChanged将被成功处理。
我偶然发现了一个解决方案,如果我在Page_Load中初始化会话变量(因此事件处理程序只是设置已存在的会话变量的值而不是创建新的会话变量)问题就会消失。 / p>
我很高兴这样做,但我很好奇究竟是什么原因。谁能解释一下?
(我怀疑设置会话变量会收到服务器的响应,然后返回给'调用者',但它不知道如何处理导致异常的响应?)
编辑:我在一个单独的小项目中重现了这个问题:Default.aspx的
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="SessionTest._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<div>
<asp:UpdatePanel id="upCategorySelector" runat="server">
<ContentTemplate>
Category:
<asp:DropDownList ID="ddlCategory" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlCategories_SelectedIndexChanged">
<asp:ListItem>Item 1</asp:ListItem>
<asp:ListItem>Item 2</asp:ListItem>
<asp:ListItem>Item 3</asp:ListItem>
</asp:DropDownList>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
</body>
</html>
Default.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
namespace SessionTest
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// If I do this, the exception does not occur.
if (Session["key"] == null)
Session.Add("key", 0);
}
protected void ddlCategories_SelectedIndexChanged(object sender, EventArgs e)
{
// If Session["key"] has not been created, setting it from
// the async call causes the excaption
Session.Add("key", ((DropDownList)sender).SelectedValue);
}
}
}