在使用asp.net事件验证时,如何防止半载页面的表单提交异常?

时间:2008-10-31 17:47:16

标签: asp.net eventvalidation

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

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

安全目的,       此功能验证回发或回调的参数   事件起源于       最初呈现它们的服务器控件。如果数据有效   和预期,使用       ClientScriptManager.RegisterForEventValidation   注册方法       用于验证的回发或回调数据。

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

5 个答案:

答案 0 :(得分:4)

我回答了类似的问题here。引用:

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

<强>的Web.config

<configuration>

    <system.web>

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

    </system.web>

</configuration>

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

答案 1 :(得分:2)

我发现__EVENTVALIDATION字段比没有加载ViewState更常引起这种情况。 __EVENTVALIDATION位于页面底部,如果用户在收到回发时未收到该错误,则会收到该异常。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

我花了很长时间试图找出为什么__EVENTVALIDATION标记在特定网站的底部呈现,但在每个其他网站上都呈现在顶部。我最终发现这是因为Render覆盖事件中的代码。这一点,以及精益的视图状态大多摆脱了这个错误,但只是为了好的措施,我在导致错误的按钮上添加了下面的逻辑:

页面上某处的javascript

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

向asp添加属性:按钮:

OnClientClick="return CheckForHiddenFields();"