当前位置:  开发笔记 > 后端 > 正文

无效的回发或回调参数.使用'<pages enableEventValidation ="true"/>'启用事件验证

如何解决《无效的回发或回调参数.使用'<pagesenableEventValidation="true"/>'启用事件验证》经验,为你挑选了14个好方法。

当我从客户端发回页面时,我收到以下错误.我有JavaScript代码修改客户端的asp:ListBox.

我们如何解决这个问题?

错误详情如下:

Server Error in '/XXX' Application.

--------------------------------------------------------------------------------
Invalid postback or callback argument.  Event validation is enabled using  in configuration or <%@ Page EnableEventValidation="true" %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.ArgumentException: Invalid postback or callback argument.  Event validation is enabled using  in configuration or <%@ Page EnableEventValidation="true" %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[ArgumentException: Invalid postback or callback argument.  Event validation is enabled using  in configuration or <%@ Page EnableEventValidation="true" %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.]
   System.Web.UI.ClientScriptManager.ValidateEvent(String uniqueId, String argument) +2132728
   System.Web.UI.Control.ValidateEvent(String uniqueID, String eventArgument) +108
   System.Web.UI.WebControls.ListBox.LoadPostData(String postDataKey, NameValueCollection postCollection) +274
   System.Web.UI.WebControls.ListBox.System.Web.UI.IPostBackDataHandler.LoadPostData(String postDataKey, NameValueCollection postCollection) +11
   System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad) +353
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1194

--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:2.0.50727.1433; ASP.NET Version:2.0.50727.1433

小智.. 180

你的Page_Load活动中有代码吗?如果是,那么也许通过添加以下将有所帮助.

if (!Page.IsPostBack)
{ //do something }

当您单击命令并再次运行Page_load时会抛出此错误,在正常的生命周期中将是Page_Load - > Click on Command - > Page_Load(再次) - > Process ItemCommand Event



1> 小智..:

你的Page_Load活动中有代码吗?如果是,那么也许通过添加以下将有所帮助.

if (!Page.IsPostBack)
{ //do something }

当您单击命令并再次运行Page_load时会抛出此错误,在正常的生命周期中将是Page_Load - > Click on Command - > Page_Load(再次) - > Process ItemCommand Event


咄!从MVC回到webforms是一件痛苦的事.这是正确的答案
啊哈!非常感谢,这就是我的伎俩!我在页面加载中重新下载了一个下拉列表,因此框架失去了对ddl中项目(新项目)的控制,以及我点击的项目(不再存在)
我做了这个,但它对我不起作用,因为我必须在page_load事件中运行代码,因为它不是回发时,所以我仍然得到相同的错误.禁用我的转发器的视图状态可以解决问题.

2> norbertB..:

问题是ASP.NET无法了解这个额外的或删除的listitem.你有很多选择(如下所列):

禁用事件验证(糟糕的想法,因为你失去了一点安全性,成本很低).

使用ASP.NET Ajax UpdatePanel.(如果添加或删除列表框,请将列表框放在Updatepanel中并触发更新.这样,viewstate和相关字段将获得更新,并且事件验证将通过.)

忘记客户端并使用经典回发并添加或删除listitems服务器端.

我希望这有帮助.



3> 小智..:

我有过DataGrid的经验.其中一个栏目是"选择"按钮.当我点击任何行的"选择"按钮时,我收到此错误消息:

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

我改变了几个代码,最后我成功了.我的经历路线:

1)我将页面属性更改为EnableEventValidation="false".但它没有用. (出于安全原因,这不仅是危险的,我的事件处理程序没有被调用:void Grid_SelectedIndexChanged(object sender, EventArgs e)

2)我ClientScript.RegisterForEventValidation在Render方法中实现.但它没有用.

protected override void Render(HtmlTextWriter writer)
{
    foreach (DataGridItem item in this.Grid.Items)
    {
        Page.ClientScript.RegisterForEventValidation(item.UniqueID);
        foreach (TableCell cell in (item as TableRow).Cells)
        {
            Page.ClientScript.RegisterForEventValidation(cell.UniqueID);
            foreach (System.Web.UI.Control control in cell.Controls)
            {
                if (control is Button)
                    Page.ClientScript.RegisterForEventValidation(control.UniqueID);
            }
        }
    }
}

3)我将网格列中的按钮类型从PushButton更改为LinkButton.有效!("ButtonType ="LinkBut​​ton").我认为如果你可以在其他情况下将按钮更改为其他控件,如"LinkBut​​ton",它将正常工作.


尝试添加到按钮UseSubmitBehavior ="False"http://stackoverflow.com/questions/2968525/templatefield-button-causing-gridview-invalid-postback/12081309#12081309

4> 小智..:

你真的想做2或3,不要禁用事件验证.

向asp:listbox客户端添加项目有两个主要问题.

首先是它干扰了事件验证.返回服务器的不是它发送的内容.

第二个是即使您禁用事件验证,当您的页面被回发后,列表框中的项目将从视图状态重建,因此您在客户端上所做的任何更改都将丢失.这样做的原因是asp.net不希望在客户端上修改列表框的内容,它只需要进行选择,因此它会丢弃您可能做出的任何更改.

最好的选择是最有可能使用建议的更新面板.另一个选择,如果你真的需要做这个客户端,是使用普通的旧.然后,当然,你必须在服务器上再次拆分它并对你的项目做一些事情,因为你的选择是空的,因为它已经回到了服务器上.

总而言之,这是一个非常麻烦的解决方案,我不会真正推荐,但如果你真的必须对listBox进行客户端修改,它确实有效.不过,我真的建议你在走这条路之前先看一下updatePanel.


c,您不需要将所选项目保留在隐藏字段中,如果您使选择框runat ="server",您可以从Request.Form [_selectid_.UnqiueID]中读取已发布的返回值.如果选择了多个,则浏览器会将值作为csv发布.请注意,由于您已修改服务器不知道的客户端上的itrmlist,因此服务器上的控件的items和selectedindex属性将出错.

5> Umar Farooq ..:

我在Repeater中遇到了同样的问题,因为我在一个启用了EnableEventValidation的网站上有一个带有Repeater控件的网页.这不好.我收到了无效的回发相关异常.

对我有用的是为Repeater设置EnableViewState ="false".优点是它使用起来更简单,就像为网站或网页切换事件验证一样简单,但范围远远小于切换事件验证.


我有一个传统的Web控件的确切问题.我们的网络平台/ CMS(sitecore)得到了一个重大的更新,开启了事件验证(它以前已经关闭了!哎哟!).转发器控件在Web画廊中显示图像(带有按钮以重新排列它们),并且在回发这些按钮时会发生异常.我按照你的建议使用EnableViewState ="false"在转发器上禁用了视图状态,并且嘿它工作正常.正如其他人发现的那样,Overriding Render()和使用ClientScriptManager.RegisterForEventValidation()对我来说不起作用.谢谢!

6> 小智..:

以上都不适合我.经过多次挖掘后,我意识到我忽略了在页面上应用的2个表单,这些表单导致了问题.


...

请注意,最近ASP.NET已开始考虑在iframe文档中包含表单标记的表单标记中的iframe作为嵌套框架.我不得不从表单标签中移出iframe以避免此错误.



7> Josh..:

在客户端上使用JavaScript修改ListBox时遇到了同样的问题.当您从客户端向ListBox添加新项目时,会发生这种情况.

我找到的修复是通知事件验证系统可以从客户端添加的所有可能的有效项目.您可以通过覆盖Page.Render并为JavaScript可以添加到列表框的每个值调用Page.ClientScript.RegisterForEventValidation来执行此操作:

protected override void Render(HtmlTextWriter writer)
{
    foreach (string val in allPossibleListBoxValues)
    {
        Page.ClientScript.RegisterForEventValidation(myListBox.UniqueID, val);
    }
    base.Render(writer);
}

如果列表框中有大量可能有效的值,这可能会很麻烦.在我的情况下,我在两个ListBox之间移动项目 - 一个具有所有可能的值,另一个最初为空,但是当用户单击按钮时,用JavaScript中的第一个值的子集填充.在这种情况下,您只需要遍历第一个ListBox中的项目并使用第二个列表框注册每个项目:

protected override void Render(HtmlTextWriter writer)
{
    foreach (ListItem i in listBoxAll.Items)
    {
        Page.ClientScript.RegisterForEventValidation(listBoxSelected.UniqueID, i.Value);
    }
    base.Render(writer);
}



8> 小智..:

这里没有提到的另一种方法是继承ListBox

IE浏览器.

public class ListBoxNoEventValidation : ListBox 
{
}

ClientEventValidation键关闭属性System.Web.UI.SupportsEventValidation,如果您将其子类化,除非您明确地将其重新添加,它将永远不会调用验证例程.这适用于任何控件,并且是我发现通过控件基础(即,不是页面级别)在控件上"禁用"它的唯一方法.


很好地描述了[这里](http://johanleino.wordpress.com/2009/11/17/cascadingdropdown-casues-invalid-postback-or-callback-argument-error/).

9> 小智..:

你在.aspx页面尝试类似的东西

EnableEventValidation = "假"

你可以随意提出任何问题!



10> 小智..:

如果您通过客户端脚本填充DropdownList,则在将表单提交回服务器之前清除列表; 然后ASP.NET不会抱怨,安全性仍然存在.

要获取从DDL中选择的数据,可以将"OnChange"事件附加到DDL,以使用Style ="display:none;"在隐藏的Input或文本框中收集值.



11> 小智..:

3:我将网格列中的按钮类型从"PushButton"更改为"LinkBut​​ton".有效!("ButtonType ="LinkBut​​ton")我认为如果你可以在其他情况下将按钮更改为其他控件,如"LinkBut​​ton",它将正常工作.

我希望我可以投票给你,阿米尔(唉,我的代表太低了.)我只是遇到了这个问题而且改变这个就像我的gridview上的冠军一样.稍微说一下,我认为有效的代码是:ButtonType ="Link"

我怀疑这是因为当您点击"修改"时,您的修改会更改为"更新"和"取消",然后在提交时更改回"编辑".而这些转变控制令.net感到不安.



12> yilee..:

(1)EnableEventValidation ="false"...................它对我不起作用.

(2)ClientScript.RegisterForEventValidation ....它对我不起作用.

解决方案1:

在GridView中将Button/ImageButton更改为LinkBut​​ton.有用.(但我喜欢ImageButton)

研究:Button/ImageButton和LinkBut​​ton使用不同的方法进行回发

来源文章:

http://geekswithblogs.net/mahesh/archive/2006/06/27/83264.aspx

解决方案2:

在OnInit()中,输入类似这样的代码来设置Button/ImageButton的唯一ID:

protected override void OnInit(EventArgs e) {
  foreach (GridViewRow grdRw in gvEvent.Rows) {

  Button deleteButton = (Button)grdRw.Cells[2].Controls[1];

  deleteButton.ID = "btnDelete_" + grdRw.RowIndex.ToString();           
  }
}

来源文章:

http://www.c-sharpcorner.com/Forums/Thread/35301/



13> 小智..:

我实现了一个嵌套的网格视图,我遇到了同样的问题.我使用了LinkBut​​ton而不是像这样的图像按钮:

在我有这样一个列之前:


  
 
  

我已经这样替换了.



     
      
 



14> 小智..:

我有类似的问题,但我没有使用ASP.Net 1.1,也没有通过javascript更新控件.我的问题只发生在Firefox而不是IE(!)上.

我在PreRender事件上向DropDownList添加了选项,如下所示:

DropDownList DD = (DropDownList)F.FindControl("DDlista");
HiddenField HF = (HiddenField)F.FindControl("HFlista");
string[] opcoes = HF.value.Split('\n');
foreach (string opcao in opcoes) DD.Items.Add(opcao);

我的"HF"(hiddenfield)的选项由换行符分隔,如下所示:

HF.value = "option 1\n\roption 2\n\roption 3";

问题是HTML页面在代表DropDown的"select"选项上被打破了(我的意思是换行).

所以我解决了我的问题,添加了一行:

DropDownList DD = (DropDownList)F.FindControl("DDlista");
HiddenField HF = (HiddenField)F.FindControl("HFlista");
string dados = HF.Value.Replace("\r", "");
string[] opcoes = dados.Split('\n');
foreach (string opcao in opcoes) DD.Items.Add(opcao);

希望这能有所帮助.

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有