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


238

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

我们该如何解决?

错误详情如下:

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

不要在page_load事件中执行数据绑定。
保罗·扎赫拉

Answers:


171

问题是ASP.NET无法了解这个额外的或已删除的listitem。您有很多选择(在下面列出):

  • 禁用事件验证(不好的主意,因为您损失了很少的安全性,而代价却很小)。
  • 使用ASP.NET Ajax UpdatePanel。(如果添加或删除列表框,则将列表框放在Updatepanel中并触发更新。这样,视图状态和相关字段将获得更新,并通过事件验证。)
  • 忘记客户端并使用经典的回发,并在服务器端添加或删除列表项。

我希望这有帮助。



根据上述建议,我将下拉列表放到常规的ASP.NET asp:UpdatePanel中,将下拉列表加载到后面的代码中,然后加载upNewRecord.Update();。
里卡多·阿普尔顿

183

您的Page_Load事件中是否有代码?如果是,那么也许添加以下内容将有所帮助。

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

当您单击命令并再次运行Page_load时,将引发此错误,在正常的生命周期中将是Page_Load->单击Command-> Page_Load(再次)->处理ItemCommand事件


7
非常感谢,这就是我的诀窍!我在页面加载中重新加载了一个下拉列表,因此框架失去了对ddl中各项(新项)的控制,而我单击的项(不再存在)了
迈克尔(Michel

我有和OP相同的错误...我在表单中使用向导,并且在页面加载中调用了0步骤。删除,问题消失了。谢谢...
tking

非常感谢您提供这个答案。...遇到了同样的问题,原来我只是忘记在将数据加载到网格中时忽略回发...节省了很多时间
Quagmire 2012年

10
h!从MVC返回Web表单是很痛苦的。这是正确的答案
Vishnoo Rath 2014年

2
我这样做了,但是它对我来说不起作用,因为当它不是回发时,必须在page_load事件中运行一些代码,因此我仍然遇到相同的错误。禁用中继器的viewstate可以解决此问题。
布赖恩2015年

40

我有使用DataGrid的经验。其中的一列是“选择”按钮。当我单击任何行的“选择”按钮时,我收到以下错误消息:

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

我更改了几个代码,终于成功了。我的经验路线:

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

2)我实现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”之类的其他控件,它将可以正常工作。


1
我的解决方案是放弃数据网格内的嵌套按钮。MS再次使我失望。
Jacobs Data Solutions 2010年

您的解决方案也为我工作。谢谢。但是我想知道为什么在同一程序中Button工作时为什么不工作linkButton。如果是这样,我们是否总是需要使用linkButton?我们怎样才能变得更加灵活?
弗兰克·迈亚特

8
尝试添加到您的按钮UseSubmitBehavior =“假” stackoverflow.com/questions/2968525/...
JJschk

Awesomeeeeeee :) ..您只能通过经验来学习。.您证明了真实的场景显示经验是最好的老师..伟大的答案和解释!
saun4frsh 2014年

在Render的替代中,您必须放置base.Render(writer); 最后...否则它将无法正常工作!
保罗·扎赫拉

28

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

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

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

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

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

然后,当您准备发布它时,您可以从Modifyed重新填充隐藏字段的内容<select>。然后,当然,您必须再次在服务器上将其拆分并对您的项目执行某些操作,因为您的选择现在为空,因为它已返回服务器。

总而言之,这是一个非常笨拙的解决方案,我不建议这样做,但是如果您确实需要对listBox进行客户端修改,那么它确实可以工作。但是,我确实建议您在走这条路线之前先检查一下updatePanel。


3
c,您不需要将所选项目保留在隐藏字段中,如果使选择框为runat =“ server”,则可以从Request.Form [ selectid .UnqiueID]中读取回发的值。如果选择了多个,浏览器会将其值作为csv发布。注意,控件的项目和selectedindex属性在服务器上将是错误的,因为您已经修改了服务器不知道的客户端上的itrmlist。
迈克尔

迈克尔,行得通。只要您添加“ multiple = true”,否则只会给您1个值。谢谢
Sameer Alibhai

1
对于包含换行符的下拉列表也存在相同的问题。更改为选择效果很好。谢谢!
thchaver 2014年

我使用了old old <select>,就解决了这个问题。您能告诉我为什么与客户端Ajax数据加载相比,Updatepanel需要花费大量时间来加载数据吗?
Pranesh Janarthanan

17

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

对我有用的是为Repeater设置EnableViewState =“ false”。优点是它使用起来更简单,就像为网站或网页关闭事件验证一样简单,但是范围远比为两者之一关闭事件验证都小。


3
我在旧版网络控件中遇到了这个确切的问题。我们的网络平台/ CMS(站点核心)进行了重大更新,从而启用了事件验证功能(该功能之前已关闭!糟糕!)。转发器控件正在Web画廊中显示图像(带有重新排列按钮的按钮),并且在这些按钮的回发中会发生异常。我按照您的建议使用EnableViewState =“ false”禁用了转发器上的视图状态,嘿,它起作用了。正如其他人发现的那样,覆盖Render()并使用ClientScriptManager.RegisterForEventValidation()对我不起作用。谢谢!
xan 2010年

像@xan一样,我也使用Sitecore,这正是我所需要的。
wilsjd 2012年

这也对我有用。AJAX Update面板也可以正常工作,但是在这种情况下,它不需要我overhead肿的开销,所以谢谢Umar Farooq Khawaja。
Bryan

17

以上都不对我有用。经过更多的挖掘,我意识到我忽略了导致该问题的页面上应用的2种表格。

<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文档本身中包含一个嵌套框架。我必须将iframe移出form标签,以免发生此错误。


12

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

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

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

9

这里没有提到的另一种方法是子类化ListBox

就是

public class ListBoxNoEventValidation : ListBox 
{
}

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


2
这里描述得很好。
帕维尔·霍德克

1
我认为解决此问题的最佳方法是这样做。我们应该将其固定在控件级别而不是页面级别,并冒所有涉及+1的控件的安全性的风险,并感谢@PavelHodek提供的链接。
James Poulose13年

不幸的是,如果您执行此操作,则在回发页面时,如果选择了这些列表项,则将无法识别客户端上添加的任何列表项。
乔纳森·伍德

9

您可以在.aspx页面中尝试类似的操作

EnableEventValidation =“ false”

您可以随时提出任何问题!


我认为,在这种情况下,是否最好由框架禁用内置验证功能以停止看到错误是最合适的解决方案。
Jviaches

8

如果您通过客户端脚本填写DropdownList,请先清除列表,然后再将表单提交回服务器。那么ASP.NET将不会抱怨,并且安全性仍然有效。

为了从DDL中选择数据,您可以在DDL上附加一个“ OnChange”事件,以在隐藏的Input或Style =“ display:none;”的文本框中收集值。


+1易于实现。可能不是最干净的,但是很容易。
nutch

7

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

我希望我能投票赞成你,阿米尔(我的代表太低了。)我只是遇到了这个问题,在我的gridview上更改它就像是一个冠军。放在一边,我认为有效的代码是:ButtonType =“ Link”

我怀疑这是因为当您单击“编辑”时,您的编辑将更改为“更新”和“取消”,然后在提交时又更改为“编辑”。这些移动控件使.net感到不安。


这个问题的症结在于asp.net事件验证模型,以及在回发时客户端是否修改了“页面”。您是什么意思'.....而这些转换控件使.net感到不舒服'?
Julius A

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/


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> 

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的“选择”选项上被打断(我的意思是换行)。

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

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

希望这对某人有帮助。


4

如果你改变UseSubmitBehavior="True"UseSubmitBehavior="False"你的问题将得到解决

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

那对我没用。我虽然使用图像按钮,但在转发器的表中,所以情况并不完全相同。禁用中继器的视图状态对我有用。
布赖恩2015年

3

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

只需添加一个条件if(!IsPostBack),它就可以正常工作:)



2

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


2

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


2

Ajax UpdatePanel做到了,我认为这是最简单的方法,而忽略了Ajax回发开销。


2

我知道这是一个非常古老的职位。假设您正在调用应用程序,这对我有用:

  1. 在页面上实现ICallbackEventHandler
  2. 调用ClientScriptManager.GetCallbackEventReference来调用服务器端代码
  3. 当错误消息指出时,您可以调用ClientScriptManager.RegisterForEventValidation

如果您不需要完全控制,则可以使用更新面板为您完成此操作。


2

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

出现此问题的页面</form>在“内容”部分之一中有一个标签,因此在运行时呈现了两个表单结束标签,这导致了此问题。从页面中删除多余的表单结束标签可解决此问题。


谢谢,事实证明<form>我的代码中还有其他字段。
埃里克·基加西

2

如果您正在使用gridview而不在!ispostback内的pageload上绑定gridview,那么当您单击gridview中的edit and delete row时,会发生此错误。

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

1

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

最后我换成了LinkButton。它似乎正在工作!


1

我正在使用数据列表,但按钮也遇到相同的错误。我只是使用IsPostBack检查并填充我的控件,问题就解决了!大!!!


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

1

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


从asp控件更改为常规<select id =“ director” runat =“ server”>效果很好。我可以使用以下代码在其后面的代码中访问其值:例如:string directorId = Request.Form [director.ID]
Baxter 2013年

1

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


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>标签中。


1

这就是我得到它的原因:

我有一个ASP:ListBox。最初它是隐藏的。在客户端,我将通过带有选项的AJAX填充它。用户选择了一个选项。然后,当单击“提交”按钮时,服务器将对ListBox感到很奇怪,因为它不记得它具有任何选项。

因此,我要做的是确保在将表单提交回服务器之前清除所有列表选项。这样,服务器就不会抱怨,因为列表空到客户端,然后又空了。

排序!!!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.