【问题标题】:TemplateField button causing GridView Invalid Postback导致 GridView 无效回发的 TemplateField 按钮
【发布时间】:2011-02-27 10:51:25
【问题描述】:

好的,所以我在 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" 的情况下让这种情况消失?

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

【问题讨论】:

    标签: asp.net gridview


    【解决方案1】:

    我知道这篇文章很旧,但我最近也遇到了这个问题。 在检查了如何为 asp:ButtonField 以及我在 ItemTemplate 中添加的 asp:Button 生成代码后,我发现了很大的不同:

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

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

    类型是问题!因此,在我将 UseSubmitBehavior 从“提交”更改为“假”后,我不再收到错误消息。

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

    找到以下(下面的代码在用户控件中)。

    1) 在 !IsPostBack 中绑定

    2) 在Render中注册用户控件本身

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

        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);
        }
    

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

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

    要让这一切发生,你必须

    1. 直接调用对象数据源的.Select()
    2. 从数据源捕获 OnSelecting 事件,保存选择参数设置 e.Cancel = true
    3. 检查选择参数是否不同,然后绑定网格视图,这一次当捕获 OnSelecting 时,您必须设置 e.Cancel = false 以便从数据库中检索数据 - 只需一次。

    希望这会有所帮助!

    【讨论】:

    • 伟大而简单的解决方案,感谢 Ioana! ID = "xxx" runat="server" UseSubmitBehavior="false"
    【解决方案2】:

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

    【讨论】:

    • 啊哈!就是这样。我做了一些愚蠢的事情,设置 ID 的代码并不总是在运行。谢谢先生!
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      您需要为您的按钮提供一个 ID。只是一个 runat="server" 不满足创建服务器控件所需提供的最少信息。

      【讨论】:

      • 我曾经有一个按钮 ID。不过,不管是不是他们的。我的按钮如此稀疏的原因是因为我试图尽可能地简化问题。
      • 如果您使用的是整个页面和母版页,您能否发布您的代码?
      猜你喜欢
      • 2014-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多