无效的回发或回调参数。单击按钮时

时间:2010-08-03 03:10:00

标签: asp.net asp.net-ajax cascadingdropdown invalid-postback

我有一个包含各种控件的网页。其中两个是下拉列表。第一个下拉列表从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.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)+2071

抱歉可怕的格式化。有关为什么会抛出此错误以及如何防止它的任何建议?

谢谢,

3 个答案:

答案 0 :(得分:3)

这是 AJAX CascadingDropDown 扩展程序的已知问题。

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

以下是讨论该问题的主题: http://forums.asp.net/t/1032053.aspx

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

你有两个选择:

  1. 抛弃AJAX CascadingDropDown,替换为常规下拉列表,使用jQuery / javascript调用客户端上的Web服务。
  2. 在页面上禁用事件验证。 (不推荐)。
  3. 事件验证可防止页面状态在请求之间被篡改。不幸的是,无论出于何种原因,AJAX CDDL就是这样做的。

    这不是为了让CDDL正常工作而禁用的,因为它会影响整个页面并导致安全问题。

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

答案 1 :(得分:3)

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

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

基本上你只是将dropdownlist类子类化,它除去了SupportsEventValidation属性 - > ASP.NET不再验证值,一切运行正常!

在这里阅读整篇文章: Subclassing the DropDownList to remove the SupportsEventValidation attribute

答案 2 :(得分:0)

我经常搜索并最终解决了这个问题: http://avinashsing.sunkur.com/2011/03/24/dropdownlist-in-asp-net-does-not-retain-control-state/

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

  

受保护的子cbGenericDropDownList_DataBound(发件人为对象,e为System.EventArgs)   如果Not IsNothing(HttpContext.Current.Request(DirectCast(sender,DropDownList).UniqueID))那么   DirectCast(sender,DropDownList).SelectedValue = _   HttpContext.Current.Request(DirectCast(sender,DropDownList).UniqueID)   万一   结束子

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

相关问题