当我从客户端发回页面时,出现以下错误。我有在客户端修改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事件中执行数据绑定。

#1 楼

问题是ASP.NET无法了解这个额外的或已删除的listitem。
您有很多选项(在下面列出):想法,因为您损失了一些安全性,而付出的代价却很小。)
使用ASP.NET Ajax UpdatePanel。 (如果添加或删除列表框,则将列表框放入Updatepanel并触发更新。这样,视图状态和相关字段将获得更新和事件验证。)
忘记客户端,使用经典回发并添加或删除服务器端列表项。

我希望这会有所帮助。

评论


另一种选择:实现IPostBackEventHandler并调用js __doPostBack('<%= UniqueId.ToString()%>',arg)

– gdbdable
2014年5月22日在7:11

根据上述建议,我将下拉列表放到常规的ASP.NET asp:UpdatePanel中,将下拉列表加载到后面的代码中,然后再加载newNewRecord.Update();。

–里卡多·阿普尔顿
16年1月19日在11:24

#2 楼

您的Page_Load事件中是否有代码?如果是,那么添加以下内容可能会有所帮助。生命周期将是
Page_Load->单击Command-> Page_Load(再次)->处理ItemCommand事件

评论


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

–米歇尔
2011年1月10日19:32



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

–tking
2011年1月25日在22:48

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

– Quagmire
2012年5月14日晚上8:41

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

– Vishnoo Rath
2014年8月29日在8:16

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

–布莱恩(Bryan)
15年4月14日在20:34

#3 楼

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


“无效的回发或回调参数。使用in configuration或
<为了安全起见,此功能验证页面回发或
回调事件的参数源自最初呈现它们的服务器控件。如果数据有效且预期,使用
ClientScriptManager.RegisterForEventValidation方法来注册回发或回调数据以进行验证。“


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

1)我将page属性更改为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”之类的其他控件,它将正常工作。

评论


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

–Jacobs数据解决方案
10年6月16日在20:49

您的解决方案也为我工作。谢谢。但是我想知道为什么当linkBut​​ton在同一程序上工作时Button不起作用。如果是这样,我们是否总是需要使用linkBut​​ton?我们怎样才能变得更加灵活?

–坦率的Myat Thu
2012年10月29日6:42

尝试添加到您的按钮UseSubmitBehavior =“ False”stackoverflow.com/questions/2968525/…

– JJschk
2012年12月6日18:04

Awesomeeeeeee :) ..您只能从经验中学到这一点。.您证明了真实的情景表演经验是最好的老师。

– saun4frsh
2014年7月27日在13:09

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

– Paul Zahra
16年4月7日在10:29

#4 楼

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

向asp中添加项目有两个主要问题:列表框客户端。


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

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

然后,当您准备好发布它时,您可以从修改后的<select>中重新填充隐藏字段的内容。然后,当然,您必须再次在服务器上拆分它并对您的项进行处理,因为您的选择现在已返回服务器,因此您的选择为空。我不会真的建议您这样做,但是如果您确实必须对listBox进行客户端修改,那么它确实可以工作。但是,我真的建议您在走这条路线之前先检查一下updatePanel。

评论


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

–迈克尔
2011年6月29日在1:37

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

– Sameer Alibhai
2011年12月7日在16:57

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

–切肉刀
2014年2月12日在22:05

我使用普通的效果很好。我可以使用以下代码在其后面的代码中访问其值:例如:字符串directorId = Request.Form [director.ID]

–Baxter
2013年9月25日16:25

#28 楼

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

#29 楼

如果您预先知道可以填充的数据,则可以使用ClientScriptManager来解决此问题。在先前的用户选择中使用javascript动态填充下拉框时,我遇到了这个问题。下拉列表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#的细微变化可能是: br />
对于新手:这应该放在文件(.vb或.cs)后面的代码中,或者如果用于aspx文件中,则可以包装在<script>标记中。

#30 楼

这就是我得到它的原因:

我有一个ASP:ListBox。最初它是隐藏的。在客户端,我将通过带有选项的AJAX填充它。用户选择了一个选项。然后,当单击“提交”按钮时,服务器将使ListBox变得很有趣,因为它不记得它具有任何选项。将表单提交回服务器。这样,服务器就不会抱怨,因为列表转到客户端是空的,然后又回到了空。

排序!!!