TemplateField按钮导致GridView无效回发

时间:2010-06-03 17:56:28

标签: asp.net gridview

好的,所以我在gridview中有一个只包含一个简单按钮的模板字段......

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Administration.aspx.cs"     
Inherits="Administration" %>
<%@ Register TagPrefix="ajaxToolkit" Namespace="AjaxControlToolkit" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">    
    <title>Keywords Administration</title>
</head>
<body class="popupbody">
<form id="form1" runat="server">
    <ajaxToolkit:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server" EnablePartialRendering="true" CombineScripts="false"></ajaxToolkit:ToolkitScriptManager>

    <asp:Label ID="AddLabel" runat="server">Add a Keyword</asp:Label>
    <br />
    <asp:TextBox ID="AddTextBox" runat="server" />
    <asp:Button ID="AddButton" Text="Add" runat="server" OnClick="AddKeyword_Click" />

    <asp:GridView ID="KeywordsGridView" AllowPaging="false" AutoGenerateColumns="false" BackColor="white"
        GridLines="None" HeaderStyle-CssClass="Table_Header" RowStyle-CssClass="Table_Style" 
        OnRowDataBound="RowBound" runat="server">
        <Columns>
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:Button runat="server" />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:BoundField DataField="References" SortExpression="References" HeaderText="Total References" />
            <asp:BoundField DataField="Keyword" SortExpression="Keyword" HeaderText="Keyword" />
        </Columns>
    </asp:GridView>
</form>
</body>
</html>

每当我点击按钮时,我都会收到错误...

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. 

我发现有相当数量的文章引用这个问题,包括一些关于SO的文章,例如......

Invalid postback or callback argument. Event validation is enabled using '<pages enableEventValidation="true"/>'

和...

Invalid postback or callback argument

我可能只是误会,但据我所知,他们并没有真正帮助我。如何在不设置enableEventValidation =“false”的情况下让它消失?

编辑发布了我页面的所有代码。

4 个答案:

答案 0 :(得分:12)

我知道这篇文章很老,但我最近也遇到过这个问题。 在检查了为asp:ButtonField生成代码的方式以及我在ItemTemplate中添加的asp:Button后,我发现了很大的区别:

的asp:ButtonField字段: input type =“button”onclick =“javascript:__ doPostBack('ctl00 $ ctl00 $ cphMain $ cphContent $ gvEmails','SendFromBatch $ 0')”value =“Continue”&gt;

的asp:按钮: 输入id =“ctl00_ctl00_cphMain_cphContent_gvEmails_ctl02_btnCont” type =“submit” onclick =“FreezeScreen('正在发送电子邮件...');” value =“继续”name =“ctl00 $ ctl00 $ cphMain $ cphContent $ gvEmails $ ctl02 $ btnCont”&gt;

Type是问题所在!因此,在我将 UseSubmitBehavior 从“提交”更改为“错误”后,我再也没有收到错误。

编辑: 我最近想从普通的btns改为imgBtns,这样我就可以节省一些空间并使gridview更好:D。当然我弹出同样的问题而且imagebtn没有UseSubmitBehavior属性,所以我开始寻找解决方案。

找到以下内容(以下代码位于UserControl中)。

1)绑定!IsPostBack

2)在Render

中注册usercontrol本身

一切都按计划运行 - 没有验证错误。

    protected void Page_Load(object sender, EventArgs e)
    {
        OnLoadingEvent(new EventArgs());

        if (!Page.IsPostBack)
        {
            gvEmails.DataSource = odsEmails;
            try
            {
                gvEmails.DataBind();
            }
            catch (Exception)
            {
            }
        }

        if (!writeText) divWriteEmail.Visible = false;
    }

    protected override void Render(HtmlTextWriter writer)
    {
        Page.ClientScript.RegisterForEventValidation(this.UniqueID);

        base.Render(writer);
    }

编辑: 我正在玩上面的代码并问自己,如果你真的需要重新绑定你的objectdatasource怎么办 - 那么会发生什么?如果你在页面加载中重新绑定,上面的代码将不起作用,因为当你在gridview的行中单击btn时,gridview将再次反弹,并且它将不会被识别为在服务器上生成。公平和正方形,但如何避免这种行为?嗯...我想出了一个方法,也许不是最好的,但它可以解决问题。

实际上,当您单击gv行上的btn时,您不想重新绑定gridview ...但是我们怎么知道,因为首次调用页面加载方法?好吧,实际上我不想重新绑定gridview,如果对象数据源的select参数没有改变。因此,我在会话视图中保留了objectDataSource的select参数,并且只有当其中一个更改时才重新绑定我的gridview - 此行为仅在PageLoad事件期间。为了查看最新的行,我点击刷新并获得最新的行没有问题,此刻我点击gvRow btn,错误消失。

为了实现所有这一切,你必须

  1. 直接调用对象数据源的.Select()
  2. 从数据源捕获OnSelecting事件,保存select参数集e.Cancel = true
  3. 检查select参数是否不同然后绑定gridview,这次捕获OnSelecting时你必须设置e.Cancel = false才能从DB中检索数据 - 只有一次。
  4. 希望这有帮助!

答案 1 :(得分:6)

This fellow找到了类似问题的解决方案(向下滚动到第4条评论),这是为GridView按钮设置唯一ID。

答案 2 :(得分:2)

我今天遇到了类似的错误,但有一个不同的解决方案。我已经使用gridviews多年了,从来没有遇到过这个问题所以我认为它一定是愚蠢的。事实证明,我忘记了将加载gridview的代码放入if(!Page.IsPostBack)块,导致按钮在单击后重新创建,从而导致错误。将加载代码放置在所述块中消除了该问题。

答案 3 :(得分:0)

您需要为按钮指定ID。只是一个runat =“server”不符合为要创建的服务器控件提供的最小信息。