Я использую ASP.NET 2.0 AJAX Extensions 1.0 с версией v1.0.20229 AJAX Control Toolkit (которая, насколько мне известно, является самой последней для .NET 2.0 / Visual Studio 2005).
Моя веб-страница (aspx) имеет элемент управления DropDownList на панели обновления. В обработчике события SelectedIndexChanged DropDownList я пытаюсь установить переменную сеанса.
При первом запуске события я получаю Sys.WebForms.PageRequestManagerParserErrorException: «Не удалось проанализировать сообщение, полученное с сервера». Если я продолжу, последующие SelectedIndexChanged будут успешно обработаны.
Я наткнулся на решение, согласно которому, если я инициализирую переменную сеанса в моем Page_Load (таким образом, обработчик событий просто устанавливает значение переменной сеанса, которая уже существует, а не создает новую), проблема исчезает. 1007 *
Я счастлив сделать это, но мне любопытно, что именно является основной причиной. Кто-нибудь может объяснить?
(Я подозреваю, что установка переменной сеанса получает ответ от сервера, который затем возвращается «вызывающему», но это не тот ответ, который он знает, как справиться с причиной исключения?)
РЕДАКТИРОВАТЬ: Я воспроизвел проблему в отдельном небольшом проекте:
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);
}
}
}