TemplateField按钮导致GridView无效回发

Car*_*ter 7 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>
Run Code Online (Sandbox Code Playgroud)

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

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. 
Run Code Online (Sandbox Code Playgroud)

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

无效的回发或回调参数.使用'<pages enableEventValidation ="true"/>'启用事件验证

和...

无效的回发或回调参数

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

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

JJs*_*chk 12

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

asp:ButtonField:input type ="button"onclick ="javascript:__ doPostBack('ctl00 $ ctl00 $ cphMain $ cphContent $ gvEmails','SendFromBatch $ 0')"value ="Continue">

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

类型是问题!因此,在我将UseSubmitBehavior从"Submit" 更改为"False"后,我再也没有收到错误.

编辑:我最近想从正常的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);
    }
Run Code Online (Sandbox Code Playgroud)

编辑:我正在玩上面的代码并问自己,如果你真的需要重新绑定你的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中检索数据 - 只有一次.

希望这可以帮助!


DOK*_*DOK 6

这个人发现了类似问题的解决方案(向下滚动到第4条评论),这是为GridView按钮设置唯一ID.