gpt4 book ai didi

asp.net - 导致 GridView 无效回发的 TemplateField 按钮

转载 作者:行者123 更新时间:2023-12-04 09:38:02 25 4
gpt4 key购买 nike

好的,所以我在 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:ButtonField 以及我在 ItemTemplate 中添加的 asp:Button 生成代码后,我发现了很大的不同:

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

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

类型是问题!所以,在我更改了 之后使用提交行为 从“提交”到“假”我没有再收到错误了。

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

找到以下内容(下面的代码在 UserControl 中)。

1) 绑定(bind)在 !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 怎么办——然后会发生什么?如果在页面加载中重新绑定(bind),上面的代码将不起作用,因为当您单击gridview行中的btn时,gridview会再次反弹,并且不会被识别为在服务器上生成。公平公正,但如何避免这种行为?嗯......我想出了一个办法,也许不是最好的,但它确实有效。

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

为了让这一切发生,你必须
  • 直接调用对象数据源的.Select()
  • 从数据源捕获 OnSelecting 事件,保存选择参数设置 e.Cancel = true
  • 检查选择参数是否不同,然后绑定(bind)gridview,这次在捕获 OnSelecting 时,您必须设置 e.Cancel = false 才能从数据库中检索数据 - 仅一次。

  • 希望这可以帮助!

    关于asp.net - 导致 GridView 无效回发的 TemplateField 按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2968525/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com