【问题标题】:Error: Invalid postback or callback argument错误:无效的回发或回调参数
【发布时间】:2012-09-08 19:47:12
【问题描述】:

使用 gridview 单击按钮时出现以下错误

 Server Error in '/' 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) +144
   System.Web.UI.Control.ValidateEvent(String uniqueID, String eventArgument) +111
   System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +29
   System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +35
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1724


Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.17929

当我在 gridview 中按下一个按钮时会发生这种情况,奇怪的是我有另一个 gridview,在运行不同代码的列中也有自定义按钮,但没有给出错误。下面是页面的代码和代码隐藏。

namespace CCCC
{
    public partial class drivermangement : System.Web.UI.MasterPage
    {

        protected void Page_Load(object sender, EventArgs e)
        {
            if (System.Web.HttpContext.Current.User.Identity.IsAuthenticated)
            {
                if (Roles.IsUserInRole("Administrator"))
                {
                    LoggedInUser.Value = Convert.ToString(Request.QueryString["driver"]);
                }
                else
                {
                    LoggedInUser.Value = Membership.GetUser().UserName.ToString();
                }
                DayOfTheWeekHiddenField.Value = Convert.ToString(Request.QueryString["dow"]);
            }
            else
            {
                Response.Redirect("default.aspx");
            }
            if (NewCustomersGrid.Rows.Count == 0)
            {
                NewCustomersLabel.Visible = false;
            }
            else
            {
                NewCustomersLabel.Visible = true;
            }
            if (NeedCompostGrid.Rows.Count == 0)
            {
                NeedCompostLabel.Visible = false;
            }
            else
            {
                NeedCompostLabel.Visible = true;
            }
            if (CanceledGrid.Rows.Count == 0)
            {
                CanceledLabel.Visible = false;
            }
            else
            {
                CanceledLabel.Visible = true;
            }
            if (VacationGrid.Rows.Count == 0)
            {
                VacationLabel.Visible = false;
            }
            else
            {
                VacationLabel.Visible = true;
            }
            if (NewCustomersGrid0.Rows.Count == 0)
            {
                NewCustomersLabel0.Visible = false;
            }
            else
            {
                NewCustomersLabel0.Visible = true;
            }
            if (NeedCompostGrid0.Rows.Count == 0)
            {
                NeedCompostLabel0.Visible = false;
            }
            else
            {
                NeedCompostLabel0.Visible = true;
            }
            if (CanceledGrid0.Rows.Count == 0)
            {
                CanceledLabel0.Visible = false;
            }
            else
            {
                CanceledLabel0.Visible = true;
            }
        }

        protected void NewCustomerDoneButton_Click(object sender, EventArgs e)
        {
            int CustomerID = Convert.ToInt32(((Button)sender).CommandArgument);
            string CustomerBinNeedAcknowledged = "Yes";
            string strConnString = "Data Source";
            using (SqlConnection con = new SqlConnection(strConnString))
            {
                using (SqlCommand cmd = new SqlCommand())
                {
                    cmd.Connection = con;
                    cmd.CommandType = CommandType.Text;
                    cmd.CommandText = "UPDATE Customers SET CustomerBinNeedAcknowledged=@CustomerBinNeedAcknowledged WHERE CustomerID=@CustomerID";
                    cmd.Parameters.AddWithValue("@CustomerBinNeedAcknowledged", CustomerBinNeedAcknowledged);
                    cmd.Parameters.AddWithValue("@CustomerId", CustomerID);
                    con.Open();
                    cmd.ExecuteNonQuery();
                    con.Close();
                }
            } 
       }

和实际页面:

<%@ Master Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" Inherits="CCCCCC.drivermangement" CodeBehind="drivermangement.master.cs" %>
<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <asp:HiddenField ID="LoggedInUser" runat="server" />
    <asp:HiddenField ID="DayOfTheWeekHiddenField" runat="server" />
    <ajaxToolkit:TabContainer ID="RoutingTabs" runat="server" ActiveTabIndex="0" 
        Width="900px">
        <ajaxToolkit:TabPanel runat="server" HeaderText="Pre-Route" ID="PreRouteTab">
        <ContentTemplate>
<br />
<asp:Label ID="NewCustomersLabel" runat="server" 
        style="font-weight: 700; font-size: large; color: #009933" Text="New Customers"></asp:Label>

<asp:GridView ID="NewCustomersGrid" runat="server" AllowPaging="True" AutoGenerateColumns="False" BackColor="White" 
        BorderColor="#999999" BorderStyle="Solid" BorderWidth="1px" CellPadding="3" 
        DataKeyNames="CustomerId" DataSourceID="NewCustomers" ForeColor="Black" 
        GridLines="Vertical">
<AlternatingRowStyle BackColor="#99FF99" ></AlternatingRowStyle>
<Columns>
<asp:BoundField DataField="CustomerFullName" HeaderText="Name" 
                SortExpression="CustomerFullName" />
<asp:BoundField DataField="CustomerFullAddress" HeaderText="Address" 
                SortExpression="CustomerFullAddress" />
<asp:BoundField DataField="CustomerNeedsBin" HeaderText="Needs Bin?" 
        SortExpression="CustomerNeedsBin" />
<asp:TemplateField ShowHeader="False"><ItemTemplate>
                <asp:Button ID="NewCustomerDoneButton" runat="server" CommandName="" 
                Text="Done" CommandArgument='<%# Eval("CustomerID") %>' OnClick="NewCustomerDoneButton_Click" CausesValidation="False" />

</ItemTemplate>
</asp:TemplateField>
</Columns>
<asp:SqlDataSource ID="NewCustomers" runat="server" 
        ConnectionString="<%$ ConnectionStrings:tcc_customersConnectionString %>" 

                SelectCommand="SELECT [CustomerId], [CustomerStatus], [CustomerFullName], [CompanyName], [CustomerFullAddress], [CustomerPickUpDay], [CustomerPickUpDay2], [CustomerDriver], [CustomerNeedsBin], [CustomerBinNeedAcknowledged] FROM [Customers] WHERE (([CustomerBinNeedAcknowledged] = @CustomerBinNeedAcknowledged) AND ([CustomerNeedsBin] = @CustomerNeedsBin) AND ([CustomerDriver] = @CustomerDriver) AND ([CustomerStatus] = @CustomerStatus) AND ([CustomerPickUpDay] = @CustomerPickUpDay OR [CustomerPickUpDay2] = @CustomerPickUpDay2))"><SelectParameters>
<asp:Parameter DefaultValue="No" Name="CustomerBinNeedAcknowledged" Type="String" />
<asp:Parameter DefaultValue="Yes" Name="CustomerNeedsBin" Type="String" />
<asp:ControlParameter ControlID="LoggedInUser" Name="CustomerDriver" 
            PropertyName="Value" Type="String"></asp:ControlParameter>
<asp:Parameter DefaultValue="New" Name="CustomerStatus" Type="String" />
<asp:ControlParameter ControlID="DayOfTheWeekHiddenField" Name="CustomerPickUpDay" 
                PropertyName="Value" Type="String" ></asp:ControlParameter>
<asp:ControlParameter ControlID="DayOfTheWeekHiddenField" 
            Name="CustomerPickUpDay2" PropertyName="Value" Type="String" />
</SelectParameters>
</asp:SqlDataSource>

</ContentTemplate>

</ajaxToolkit:TabPanel>
        <ajaxToolkit:TabPanel runat="server" HeaderText="Post-Route" ID="PostRouteTab"><ContentTemplate>

我现在想知道,这与GridViewAjax Tab Container 中的事实有关吗?因为我的其他工作正常的表不是......

注意:由于字符限制,不得不从页面中删除一些代码

【问题讨论】:

  • 忘了注意,我不想禁用事件验证。它只是解决了问题(继续,但视图没有更新)并且让我容易受到攻击,因为它是一种安全措施
  • 请仅分享相关代码位;这可能是您投反对票的原因
  • 您在使用更新面板吗?您是在动态向网格中添加数据吗?
  • @NoviceProgrammer谢谢,我会稍微编辑一下。我想知道发生了什么事......而且没有更新面板,只有 Ajax Tab Container 和网格数据绑定到我的 sql 服务器
  • @NoviceProgrammer 重新编辑,现在只包含与按钮、其网格视图和页面加载相关的内容

标签: c# asp.net ajax button gridview


【解决方案1】:

1) GridView 中的回发或回调参数无效 问题可能是:您正在将 Page_Load 事件中的数据与对象数据源或手动绑定与函数调用绑定。这将使您的 GridView 在任何控件的每个事件触发上绑定数据。

当您使用 OnRowCommand 触发任何 GridView 命令时,在 RowCommand 触发之前,您的 GridView 将重新绑定,并且其中的所有控件都将分配给新的 id。所以 RowCommand 无法获取触发事件的项目。

GridView中Postback或Callback参数无效的解决方法:你可以在这个if条件下绑定你的数据

if (!IsPostBack)
{
    //Your code for Bind data 
}

如果这不起作用,此代码肯定会为您提供解决方案,然后检查是否有任何其他控件没有给出错误。

【讨论】:

【解决方案2】:

您是否正在通过 javascript 或 Ajax 更新 Grid 或任何此类控件。

如果是这种情况,那么您可能会遇到这种情况。可能的解决方案是将 EnableEventValidation 设置为 false。

【讨论】:

  • 不。这些都不是,出于安全原因,我不想将 EnableEventValidation 设置为 false
【解决方案3】:

尝试一些事情

  1. 在您的 Page Load 事件中,添加对 !Page.IsPostBack 的检查并将非身份验证代码块移到那里。
  2. 使用LinkButton 代替常规按钮进行实验。

【讨论】:

    【解决方案4】:

    这可能是因为您使用了任何第三方控件。

    我也有这个错误。在我的情况下,我在更新面板和中继器控件中有一个中继器控件,我使用的是 Telerik datepicker 控件。它在 IE 中运行良好,但在 Mozilla 和 chrome 中运行良好。我通过从 chrome 和 IE 发送请求检查了这两种情况下的表单数据,发现触发控件值略有不同。我使用 Telerik RadAjaxmanager 而不是 updatepanel 错误消失了。

    【讨论】:

      【解决方案5】:

      我测试了上述所有解决方案和其他帖子,但我的问题还没有解决。

      当在服务器端的网格事件结束时取消事件时,我的问题得到了解决。

      当我们使用gridview的edit事件时,就会出现这种问题。 只需添加 e.Cancel = true;在活动结束时。

      protected void grdEducation_RowEditing(object sender, GridViewEditEventArgs e)
      {
        // do your processing ... 
      
        // at end     
        e.Cancel = true;
      }
      

      【讨论】:

        猜你喜欢
        • 2012-01-16
        • 1970-01-01
        • 2014-11-18
        • 1970-01-01
        相关资源
        最近更新 更多