无效的回发或回调参数。使用启用事件验证

时间:2015-11-02 14:23:50

标签: c# asp.net validation callback postback

从2.0迁移到.net 4.5.1后我有这个错误

  

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

     

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

  System.Web.UI.ClientScriptManager.ValidateEvent(String uniqueId,String argument)+144
  System.Web.UI.Control.ValidateEvent(String uniqueID,String eventArgument)+111
  System.Web.UI.WebControls.DropDownList.LoadPostData(String postDataKey,NameValueCollection postCollection)+55
  System.Web.UI.WebControls.DropDownList.System.Web.UI.IPostBackDataHandler.LoadPostData(String postDataKey,NameValueCollection postCollection)+16
  System.Web.UI.Page.ProcessPostData(NameValueCollection postData,Boolean fBeforeLoad)+303
  System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)+1593

我能做什么?

我在localhost上有这个问题,但如果我尝试远程访问它,问题就解决了(在另一个工作站上)。如果同事试图在他的电脑(对我工作的那个)上访问它,他们会遇到同样的问题,但是如果他们使用我的工作站,应用程序就可以工作。

2 个答案:

答案 0 :(得分:9)

我遇到了同样的问题。 在我的情况下,问题是由于我在表单标记中插入javascript而javascript正在提交表单引起的。代码运行良好多年,直到我将我的解决方案从.NET 3.5移到4.5.1。 在ASP.NET WebForm中,会自动生成一些隐藏字段。其中一个字段是__EVENTVALIDATION字段,它可以防止发布未经授权的数据(例如从javascript向DropDownList服务器控件添加额外选项)。

<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEdAAN+KgYAJkWoXhOSD3+DUVvd3588JQsnNAC5MN7/uyI1ci6YmP63wnPMGlpCSu3QTgdg0MzSFI9etYOG29clJ48nEH4YX8U9SWslVBX+CGpmog==" />

通常这些隐藏字段是作为表单内的第一个元素生成的。但是在升级之后,这个元素开始显示为表单中的最后一个元素,就在我正在进行提交的javascript下面。因此,此字段未作为请求的一部分发送,服务器将此解释为尝试发布未经授权的数据。

经过一番研究后,我发现web.config中有一个配置可用于控制字段的位置:

<system.web>
    <pages renderAllHiddenFieldsAtTopOfForm="true" />
</system.web>

但是默认情况下这是真的,所以没有效果。在研究了这个配置并在这里找到部分答案之后Why is the renderAllHiddenFieldsAtTopOfForm configuration setting ignored? ,我使用Resharper + DotPeek +来自http://http://referencesource.microsoft.com/的代码来调试System.Web程序集。我发现在调试模式下,InnerWriter属性不是HttpWriter,而是 Microsoft.VisualStudio.Web.PageInspector.Runtime.Tracing.BrowserLinkExecutionListener.PassthroughPositionTracker.PassthroughTextWriter 的类型。 PageInspector功能干扰了页面呈现。

我的解决方案:

通过在web.config中的appsettings部分插入以下标记来禁用PageInspector(我根本不需要它):

<appSettings>
  <add key="PageInspector:ServerCodeMappingSupport" value="Disabled" />
</appSettings>

这对我有用。更多信息http://bchavez.bitarmory.com/archive/2012/12/28/rip-page-inspector-out-of-your-web-site-projects-now.aspx

答案 1 :(得分:1)

问题是我在整个页面加载之前提交了表单,_EVENTVALIDATION由于某些原因我不明白,在表单的末尾。我重写了Render方法并将_EVENTVALIDATION输入移到了表单的顶部。现在它有效。