ArgumentException: 回发或回调参数无效

源错误:
执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。  

堆栈跟踪:

[ArgumentException: 回发或回调参数无效。在配置中使用 <pages enableEventValidation="true"/> 或在页面中使用 <%@ Page EnableEventValidation="true" %> 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。]
  System.Web.UI.ClientScriptManager.ValidateEvent(String uniqueId, String argument) +427
  System.Web.UI.Control.ValidateEvent(String uniqueID, String eventArgument) +101
  System.Web.UI.WebControls.DropDownList.LoadPostData(String postDataKey, NameValueCollection postCollection) +104
  System.Web.UI.WebControls.DropDownList.System.Web.UI.IPostBackDataHandler.LoadPostData(String postDataKey, NameValueCollection postCollection) +42
  System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad) +610
  System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2877

 

在网上找到几种解决方案

1.将<pages enableEventValidation="true"/>改为<pages enableEventValidation="false"/>,但是这样取不到客户端增加的值。

2.将dropdownlist的value值设为数字或者英文,不要使用中文。我尝试了一下,没有成功。

3.使用RegisterForEventValidation注册客户端控件的值。

可能还有别的方法,不过我没有注意到。我是参考的第三种方法实现的。

解决方法:在Page_Load之前加入如下代码

protected override void Render(HtmlTextWriter writer)
    {
         ClientScript.RegisterForEventValidation(DropDownList1.UniqueID, "argument");
        base.Render(writer);
    }

 

  DropDownList1就是你要使用客户端脚本动态增加内容的控件,而argument就是你要加入的值。例如本来DropDownList1是空的,你用脚本为它增加了“中国”,“美国”等值,这里的代码就改成

ClientScript.RegisterForEventValidation(DropDownList1.UniqueID, "中国");
ClientScript.RegisterForEventValidation(DropDownList1.UniqueID, "美国");

  原理:就是因为vs2005的这个数据验证问题了,"在asp.net render DropDownList 时,会遍历DropDownList的item,并记录所有可能的postback的值,计算的结果会被保存在page中,

<input type="hidden"
       name="__EVENTVALIDATION"
       id="__EVENTVALIDATION"
       value="/wEWBQKGg9abDQKd9sHMBgKc9s…….."
/>


  这个过程发生在control的Render()方法中,当页面postback时,ASP.NET会根据这个隐藏值检查postback values,如果找不到对应信息,就会报错"(引自http://recordsome.blogsome.com/2006/05/

  所以我们重写Render,将由脚本加入控件中的值加入到隐藏值中,就不会出现找不到相应信息的错误了。

来源:http://hi.baidu.com/jantouy/item/366b63aba008219f14107336

加支付宝好友偷能量挖...


评论(0)网络
阅读(141)喜欢(0)Asp.Net/C#/WCF