5

我有一个带有各种控件的网页。其中两个是下拉列表。第一个下拉列表从 page_load 事件的 xml 文件中填充。这工作正常。第一个下拉列表附加了一个级联下拉列表扩展器,每次更改第一个下拉列表中的选择时,它都会调用一个 Web 服务。这也很好。在我的两个下拉列表下方,我有一个将页面发回的按钮。但是,当我在第二个下拉列表中进行选择并单击按钮时,我收到以下错误:

“/”应用程序中的服务器错误。无效的回发或回调参数。使用配置或页面中的 <%@ Page EnableEventValidation="true" %> 启用事件验证。出于安全目的,此功能验证回发或回调事件的参数是否源自最初呈现它们的服务器控件。如果数据有效且符合预期,请使用 ClientScriptManager.RegisterForEventValidation 方法注册回发或回调数据以进行验证。说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.ArgumentException:回发或回调参数无效。使用配置或页面中的 <%@ Page EnableEventValidation="true" %> 启用事件验证。出于安全目的,此功能验证回发或回调事件的参数是否源自最初呈现它们的服务器控件。如果数据有效且符合预期,请使用 ClientScriptManager.RegisterForEventValidation 方法注册回发或回调数据以进行验证。

源错误:

在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。

堆栈跟踪:

[ArgumentException:回发或回调参数无效。使用配置或页面中的 <%@ Page EnableEventValidation="true" %> 启用事件验证。出于安全目的,此功能验证回发或回调事件的参数是否源自最初呈现它们的服务器控件。如果数据有效且符合预期,请使用 ClientScriptManager.RegisterForEventValidation 方法注册回发或回调数据以进行验证。] System.Web.UI.ClientScriptManager.ValidateEvent(String uniqueId, String argument) +10945696 System.Web.UI .WebControls.DropDownList.LoadPostData(String postDataKey, NameValueCollection postCollection) +72 System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad) +507 System.Web.UI.Page。

对不起,糟糕的格式。关于为什么抛出此错误以及如何防止它的任何建议?

谢谢,

4

3 回答 3

4

这是AJAX CascadingDropDown扩展器的一个已知问题。

为了使其正常工作,您需要禁用事件验证。

这是一个讨论这个问题的线程: http ://forums.asp.net/t/1032053.aspx

我有同样的问题,这就是为什么我放弃使用 CascadingDropDown 扩展器而只使用常规客户端下拉列表和一些 jQuery。

你有两个选择:

  1. 抛弃 AJAX CascadingDropDown,替换为常规下拉菜单,使用 jQuery/javascript 在客户端单击时调用 Web 服务。
  2. 禁用页面上的事件验证。(不建议)。

事件验证可防止页面状态在请求之间被篡改。不幸的是,无论出于何种原因,AJAX CDDL 正是这样做的。

您不应该仅仅为了让 CDDL 工作而禁用它,因为它会影响整个页面并可能导致安全问题。

我的建议,咬紧牙关——放弃 CDDL 并用 jQuery 代替。

于 2010-08-03T03:44:29.633 回答
3

我刚刚找到了自己问题的答案。

问题是 AJAX 将新值添加到下拉列表中,但由于它们不在视图状态中,因此 ASP.NET 因错误而停止。这里有一篇很棒的博客文章解释了如何解决这个问题,它对我很有用。

基本上你只是子类化了摆脱 SupportsEventValidation 属性的下拉列表类 - > ASP.NET 不再验证值并且一切运行正常!

在此处阅读整篇文章: 子类化 DropDownList 以删除 SupportsEventValidation 属性

于 2010-08-03T03:46:03.097 回答
0

我进行了很多搜索并最终找到了这个解决方法: http: //avinashsing.sunkur.com/2011/03/24/dropdownlist-in-asp-net-does-not-retain-control-state/

对于普通用户,在您的父页面中:

Protected Sub cbGenericDropDownList_DataBound(sender As Object, e As System.EventArgs) If Not IsNothing(HttpContext.Current.Request(DirectCast(sender, DropDownList).UniqueID)) Then DirectCast(sender, DropDownList).SelectedValue = _ HttpContext.Current.Request (DirectCast(sender, DropDownList).UniqueID) End If End Sub

然后为页面中的每个 DropDownList 控件添加: OnDataBound="cbGenericDropDownList_DataBound"

于 2012-10-03T11:58:28.940 回答