无效的回发或回调参数。使用'<pages enableeventvalidation =“true”>'</pages>启用事件验证

时间:2008-10-23 08:34:51

标签: .net asp.net .net-2.0 postback argumentexception

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

我们如何解决这个问题?

以下错误详情:

Server Error in '/XXX' Application.

--------------------------------------------------------------------------------
Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> 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 <pages enableEventValidation="true"/> 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 <pages enableEventValidation="true"/> 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

40 个答案:

答案 0 :(得分:177)

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

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

当您单击命令并再次运行Page_load时,将抛出此错误,在正常的生命周期中将会 Page_Load - &gt;点击命令 - &gt; Page_Load(再次) - &gt;处理ItemCommand事件

答案 1 :(得分:169)

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

  • 禁用事件验证(糟糕的主意,因为您失去了一点安全性,成本很低)。
  • 使用ASP.NET Ajax UpdatePanel。 (如果添加或删除列表框,请将列表框放在Updatepanel中并触发更新。这样,viewstate和相关字段将获得更新,并且事件验证将通过。)
  • 忘记客户端并使用经典回发并添加或删除服务器端的listitems。

我希望这会有所帮助。

答案 2 :(得分:39)

我有使用DataGrid的经验。其中一个栏目是“选择”按钮。当我点击任何行的“选择”按钮时,我收到了此错误消息:

  

“无效的回发或回调参数。使用配置或启用事件验证       &lt;%@ Page EnableEventValidation =“true”%&gt;在一个页面中。出于安全考虑,此功能可验证回发或参数的参数       回调事件源自最初呈现它们的服务器控件。如果数据有效且预期,请使用       ClientScriptManager.RegisterForEventValidation方法,以便注册回发或回调数据以进行验证。“

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

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

2)我在Render方法中实现了ClientScript.RegisterForEventValidation 但它不起作用。

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“,则可以正常使用。

答案 3 :(得分:27)

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

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

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

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

最佳选择最有可能使用建议的更新面板。如果您确实需要执行此客户端,则另一个选项是使用普通的<select>而不是<asp:ListBox>,并将项目列表保留在隐藏字段中。当页面在客户端上呈现时,您可以从文本字段内容的分割中填充它。

然后,当您准备发布它时,您将从修改后的<select>重新填充隐藏字段的内容。然后,当然,你必须在服务器上再次拆分它并对你的项目做一些事情,因为你的选择是空的,因为它已经回到了服务器上。

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

答案 4 :(得分:17)

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

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

答案 5 :(得分:16)

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

<body>
<form id="form1" runat="server">
<div>
        <form action="#" method="post" class="form" role="form">
        <div>
        ...
        <asp:Button ID="submitButton" runat="server"
        </div>
</div>
</body>

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

答案 6 :(得分:12)

在客户端上使用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);
}

答案 7 :(得分:9)

此处未提及的另一种方法是继承ListBox

IE中。

public class ListBoxNoEventValidation : ListBox 
{
}

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

答案 8 :(得分:7)

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

添加

  

EnableEventValidation =&#34;假&#34;

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

答案 9 :(得分:7)

  

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

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

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

答案 10 :(得分:7)

(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/

答案 11 :(得分:6)

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

在我有这样一个专栏之前:

<asp:TemplateField ItemStyle-Width="9">
  <ItemTemplate>
 <asp:ImageButton ID="ImgBtn" ImageUrl="Include/images/gridplus.gif" CommandName="Expand"
                        runat="server" />
  </ItemTemplate>
</asp:TemplateField>

我已经这样替换了。

<asp:TemplateField>
<ItemTemplate>
     <asp:LinkButton  CommandName="Expand" ID="lnkBtn"  runat="server" ><asp:Image  ID="Img"  runat="server" ImageUrl="~/Images/app/plus.gif" /></asp:LinkButton>
      </ItemTemplate>
</asp:TemplateField> 

答案 12 :(得分:6)

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

要从DDL中选择数据,您可以将“OnChange”事件附加到DDL,以使用Style =“display:none;”

在隐藏的输入或文本框中收集值。

答案 13 :(得分:5)

我有类似的问题,但我没有使用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”(隐藏字段)的选项由换行符分隔,如下所示:

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);

希望这有助于某人。

答案 14 :(得分:4)

如果您将UseSubmitBehavior="True"更改为UseSubmitBehavior="False",您的问题将得到解决

<asp:Button ID="BtnDis" runat="server" CommandName="BtnDis" CommandArgument='<%#Eval("Id")%>' Text="Discription" CausesValidation="True" UseSubmitBehavior="False" />

答案 15 :(得分:3)

此错误将在没有回发的情况下显示

添加代码:

If(!IsPostBack){

 //do something

}

答案 16 :(得分:3)

我遇到了同样的问题,我做了什么:

刚刚添加条件if(!IsPostBack),它运行正常:)

答案 17 :(得分:2)

当我们将常规ASPX页面转换为内容页面时,我们遇到了同样的问题。

包含此问题的页面在其中一个内容部分中有一个</form>标记,因此在运行时呈现了两个表单结束标记,从而导致此问题。从页面中删除额外的表单结束标记解决了这个问题。

答案 18 :(得分:2)

此问题的一个简单解决方案是在页面加载时使用 IsPostBack 检查。这将解决这个问题。

答案 19 :(得分:2)

Ajax UpdatePanel 制作它,我认为它是最简单的方式,忽略 Ajax回发开销。

答案 20 :(得分:2)

在这种情况下,将id添加到网格的RowDataBound中的按钮。它会解决你的问题。

答案 21 :(得分:2)

我知道这是一篇超级老帖子。假设您正在调用您的应用程序,这是一个对我有用的想法:

  1. 在您的网页上实施ICallbackEventHandler
  2. 调用ClientScriptManager.GetCallbackEventReference来调用服务器端代码
  3. 如错误消息所示,您可以调用ClientScriptManager.RegisterForEventValidation
  4. 如果您不需要完全控制,可以使用更新面板来执行此操作。

答案 22 :(得分:1)

我正在使用datalist,我的按钮出现了同样的错误。我只是使用IsPostBack检查并填充我的控件,问题解决了!大!!!

答案 23 :(得分:1)

如果您正在使用gridview并且未在pageload内部绑定gridview!ispostback,那么当您单击gridview中的编辑和删除行时会发生此错误。

 protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
        bindGridview();
        }

答案 24 :(得分:1)

在远程服务器(生产,测试,qa,登台等)上出现此问题,但在本地开发工作站上没有出现此问题后,我发现应用程序池配置了一个非0的RequestLimit。

这导致应用程序池放弃并回复问题中提到的异常。

答案 25 :(得分:1)

正如Nick B所说,这对我有用,你必须在某些情况下删除换行符。看看代码:

- 错误的方式:

<asp:DropDownList ID="DropDownList1" runat="server">
    <asp:ListItem Selected="True">
            Item 1</asp:ListItem>
    <asp:ListItem>
            Item 2</asp:ListItem>
    <asp:ListItem>
            Item 3</asp:ListItem>
</asp:DropDownList>

- 正确方式:

<asp:DropDownList ID="DropDownList1" runat="server">
    <asp:ListItem Selected="True">Item 1</asp:ListItem>
    <asp:ListItem>Item 2</asp:ListItem>
    <asp:ListItem>Item 3</asp:ListItem>
</asp:DropDownList>

它只在IE10 +

中出现

答案 26 :(得分:1)

这就是我得到它的原因:

我有一个ASP:ListBox。最初它被隐藏了。在客户端,我会通过AJAX填充选项。用户选择了一个选项。然后,当单击“提交”按钮时,服务器会对ListBox有所了解,因为它不记得它有任何选项。

所以我做的是确保在将表单提交回服务器之前清除所有列表选项。这样服务器没有抱怨,因为列表到客户端是空的,它回来了。

排序!!!

答案 27 :(得分:1)

如果您事先知道可以填充的数据,则可以使用ClientScriptManager解决此问题。在以前的用户选择中使用javascript动态填充下拉框时,我遇到了这个问题。

下面是一些示例代码,用于覆盖render方法(在VB和C#中)并声明下拉列表ddCar的潜在值。

在VB中:

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)

    Dim ClientScript As ClientScriptManager = Page.ClientScript

    ClientScript.RegisterForEventValidation("ddCar", "Mercedes")

    MyBase.Render(writer)
End Sub

或C#的轻微变化可能是:

protected override void Render(HtmlTextWriter writer)
{
    Page.ClientScript.RegisterForEventValidation("ddCar", "Mercedes");
    base.Render(writer);
}

对于新手:这应该放在文件后面的代码(.vb或.cs)中,或者如果在aspx文件中使用,你可以用<script>标签包装。

答案 28 :(得分:1)

最好的选择是使用隐藏字段,不要禁用事件验证,也要更改每个列表框,使用runat服务器属性选择下拉列表

答案 29 :(得分:1)

如果您使用的是Ajax更新面板。添加<Triggers>标记并在其中触发按钮或控件,使用<asp:PostBackTrigger .../>

导致postBack

答案 30 :(得分:1)

对我来说有用的是将以下代码从page_load移到page_prerender:

lstMain.DataBind();
Image img = (Image)lstMain.Items[0].FindControl("imgMain");

// Define the name and type of the client scripts on the page.
String csname1 = "PopupScript";
Type cstype = this.GetType();

// Get a ClientScriptManager reference from the Page class.
ClientScriptManager cs = Page.ClientScript;

// Check to see if the startup script is already registered.
if (!cs.IsStartupScriptRegistered(cstype, csname1))
{
    cs.RegisterStartupScript(cstype, csname1, "<script language=javascript> p=\"" + img.ClientID + "\"</script>");
}

答案 31 :(得分:1)

四分钟前我收到同样的错误。然后我像你一样在半小时内研究过。在所有论坛中,他们通常会说“添加页面enableEvent .. = false或true”。在找到之前,任何提出的解决方案都没有解决我的问题。不幸的是,这个问题是一个ASP.NET按钮。我在两秒前删除了它。我试图用“imagebutton”替换,但它也是不可接受的(因为它给出了同样的错误)。

最后我用LinkButton替换了。它似乎正在发挥作用!

答案 32 :(得分:0)

我通过不将ListBox添加到父页面/控件控件集合来解决这个确切的错误。因为我真的不需要任何服务器端功能。我只是想用它来输出自定义服务器控件的HTML,我自己在OnRender事件处理程序中做了。我希望使用控件可以使我免于写回自己的html响应。

这个解决方案可能不适用于大多数,但它使ASP.NET不会对控件执行ValidateEvent,因为控件在回发之间不会保留在内存中。

此外,我的错误特别是由于所选列表项是一个项目,该项目不在上一个回发的列表框中。可以帮助任何人。

答案 33 :(得分:0)

我有同样的问题,两个列表框和两个按钮。

列表框中的数据是从数据库加载的,您可以通过单击按钮在框之间移动项目。

我的回发无效。

事实证明,数据中包含了回车换行符,当列表框中显示时,您无法看到它。

除了IE 10和IE 11之外,

在每个浏览器中都运行良好。

删除回车换行符,一切正常。

答案 34 :(得分:0)

仅供参考我对该错误消息有同样的问题,而且我在同一页面上有2个表单标签。主页面中有一个,页面本身有一个。当我删除第二个表格标签对时,问题就消失了。

答案 35 :(得分:0)

当我在ItemDataBound上添加id时,它没有给我错误,但它没有给我命令名称。它返回命令名称为空。然后我在ItemDataBound中添加了命令名。然后它解决了同样的问题。谢谢Nilesh,非常好的建议。工作:)

答案 36 :(得分:0)

以下示例说明如何在加载页面时测试IsPostBack属性的值,以确定页面是第一次呈现还是响应回发。如果第一次呈现页面,代码将调用Page.Validate方法。 页面标记(未显示)包含RequiredFieldValidator控件,如果没有为必需的输入字段输入,则显示星号。调用Page.Validate会导致在呈现页面时立即显示星号,而不是等到用户单击“提交”按钮。回发后,您不必调用Page.Validate,因为该方法是作为Page生命周期的一部分调用的。

 private void Page_Load()
    {
        if (!IsPostBack)
        {      
        }
    }

答案 37 :(得分:0)

在服务器端的网格事件结束时取消事件解决了我的问题。

protected void grdEducation_RowEditing(object sender, GridViewEditEventArgs e)
{
  // do your processing ...

  // at end<br />
  e.Cancel = true;
}

答案 38 :(得分:0)

对我们来说,问题仅在生产环境中随机发生。 RegisterForEventValidation对我们无济于事。

最后,我们发现运行asp.net应用程序的Web场中,两个IIS服务器安装了不同的.net版本。因此,看来他们对于加密asp.net验证哈希有不同的规则。更新它们解决了大多数问题。

此外,我们在两台服务器的web.config中配置了machineKey(compatibilityMode)(在两台服务器中都相同),httpRuntime(targetFramework),ValidationSettings:UnobtrusiveValidationMode,pages(renderAllHiddenFieldsAtTopOfForm)。

我们使用此站点生成了密钥https://www.allkeysgenerator.com/Random/ASP-Net-MachineKey-Generator.aspx

我们花了很多时间来解决这个问题,希望对您有所帮助。

<appSettings>
   <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
...
</appSettings>
<system.web>
   <machineKey compatibilityMode="Framework45" decryptionKey="somekey" validationKey="otherkey" validation="SHA1" decryption="AES />
   <pages [...] controlRenderingCompatibilityVersion="4.0" enableEventValidation="true" renderAllHiddenFieldsAtTopOfForm="true" />
   <httpRuntime [...] requestValidationMode="2.0" targetFramework="4.5" />
...
</system.web>

答案 39 :(得分:-1)

检查绑定控件的数据。一些无效数据损坏了ValidateEvent。