5

我有一个带有一些动态添加按钮的页面。如果在页面完全加载之前单击按钮,则会引发经典异常:

Invalid postback or callback argument. 
Event validation is enabled using in configuration or in a page. For

出于安全目的,此功能验证回发或回调事件的参数是否来自最初呈现它们的服务器控件。如果数据有效且符合预期,请使用 ClientScriptManager.RegisterForEventValidation 方法注册回发或回调数据以进行验证。

我猜 Viewstate 字段尚未加载到表单上,其他位正在提交。在维护事件验证的同时防止此错误的最佳方法是什么?

4

5 回答 5

4

我在这里回答了一个类似的问题。去引用:

本质上,您需要让 ViewState 在页面顶部加载。在 .NET 3.5 SP1 中,RenderAllHiddenFieldsAtTopOfForm属性被添加到 PagesSection 配置中。

网页配置

<configuration>

    <system.web>

        <pages renderAllHiddenFieldsAtTopOfForm="true"></pages>

    </system.web>

</configuration>

有趣的是,它的默认值为 true。因此,从本质上讲,如果您使用的是 .NET 3.5 SP1,那么 ViewState 会自动呈现在表单顶部(在加载页面的其余部分之前),从而消除您遇到的 ViewState 错误。

于 2008-10-31T19:35:54.080 回答
2

我发现这更多地是由__EVENTVALIDATION字段引起的,而不是未加载 ViewState。位于__EVENTVALIDATION页面底部,如果在用户导致回发时客户端未收到它,您将收到该异常。

我还没有找到一个很好的解决方案,但是我通常在由于大量内容而导致这种情况的页面上将按钮连接到一个 javascript 函数,该函数检查一个 isLoaded var,该函数只设置为 true document.ready 调用。如果 isLoaded 是假的,它会默默地吃掉这个事件,如果它是真的,它会让 if 通过。这是一个痛苦的设置,但它已经结束了我的大部分无效回发问题。

于 2008-11-04T03:28:20.317 回答
0

如果您将这些按钮的可见属性默认设置为 false,并且在页面加载或事件验证结束时将其可见属性设置为 true,该怎么办?这种方式限制他们点击按钮,直到页面完全加载。

于 2008-10-31T18:01:20.543 回答
0

据我所知,ViewState 是在页面上的表单标记之后加载的。

ClientScriptManager.RegisterForEventValidation( button.UniqueID )将按钮添加到页面后,您是否尝试过使用每个按钮?根据您添加按钮的位置,页面的事件连接可能已经发生,因此按钮生成的事件可能不会注册到页面。

于 2008-10-31T19:05:12.830 回答
0

我花了很长时间试图弄清楚为什么 __EVENTVALIDATION 标签呈现在特定网站的底部,但呈现在每个其他网站的顶部。我最终发现这是因为渲染覆盖事件中的代码。这与精益视图状态一起主要消除了此错误,但为了更好地衡量,我在导致错误的按钮上添加了以下逻辑:

页面上某处的javascript

function CheckForHiddenFields()
{
    var EventValidation = document.getElementById('__EVENTVALIDATION');
    if (EventValidation && EventValidation.value && EventValidation.value != '')
    {
        return true;
    }
    else
    {
        return false;
    }
}

向 asp:Button 添加属性:

OnClientClick="return CheckForHiddenFields();"
于 2016-04-20T18:07:40.033 回答