当我从客户端返回一个页面时,我得到以下错误。我有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

当前回答

在Page_Load事件中有代码吗?如果是,那么添加以下内容可能会有所帮助。

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

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

其他回答

对我们来说,问题只在生产环境中随机发生。RegisterForEventValidation没有为我们做任何事情。

最后,我们发现在asp.net应用程序运行的web场中,两台IIS服务器安装了不同的。net版本。所以看起来他们有不同的规则加密asp.net验证散列。更新它们解决了大部分问题。

另外,我们在web中配置了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>

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

add

EnableEventValidation=“false”

你可以随便问任何问题!

问题是ASP。NET不会知道这个额外的或已删除的列表项。 你有很多选择(如下所示):

禁用eventvalidation(这是个坏主意,因为你损失了一点安全性,而代价却很小)。 使用ASP。NET Ajax UpdatePanel。(如果你添加或删除列表框,将列表框放在更新面板中并触发更新。通过这种方式,viewstate和相关字段得到更新,eventvalidation将通过。) 忘记客户端,使用经典的回发并添加或删除listitems服务器端。

你需要做2或3个,不要禁用事件验证。

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

The first is that it interferes with event validation. What came back to the server is not what it sent down. The second is that even if you disable event validation, when your page gets posted back the items in the listbox will be rebuilt from the viewstate, so any changes you made on the client are lost. The reason for this is that a asp.net does not expect the contents of a listbox to be modified on the client, it only expects a selection to be made, so it discards any changes you might have made.

最好的选择是像推荐的那样使用更新面板。另一个选择,如果你真的需要这样做的客户端,是使用普通的<select>而不是<asp:ListBox>,并保持你的项目列表在一个隐藏字段。当页面在客户端上呈现时,您可以从文本字段内容的分割中填充它。

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

总而言之,这是一个非常麻烦的解决方案,我并不推荐,但如果您确实需要对listBox进行客户端修改,它确实可以工作。但是,我真的建议您在走这条路之前查看一下updatePanel。

如果您正在使用gridview,而不是在pageload inside !ispostback中绑定gridview,那么当您单击gridview中的编辑和删除行时,将出现此错误。

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