You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不关闭EnableEventValidation的情况下启用ASP GridView行选择

解决GridView行选择时的"Invalid postback or callback argument"异常(不关闭事件验证)

问题根源

你手动通过GetPostBackClientHyperlink生成的行点击回传脚本,其包含的回传参数(如Select$0、Select$1)未被注册到ASP.NET的事件验证系统中,导致ASP.NET判定该回传为非法请求,抛出异常。你当前仅注册了GridView的控件ID,并未注册具体的回传命令参数,因此无法通过验证。

解决方案

方案一:手动注册所有行的回传参数(适配现有代码)

修改Render方法,遍历GridView的所有数据行,为每个行注册对应的选择回传参数:

Protected Overrides Sub Render(writer As HtmlTextWriter)
    For Each row As GridViewRow In TheGrid.Rows
        If row.RowType = DataControlRowType.DataRow Then
            ' 为每个数据行注册选择命令的回传参数
            ClientScript.RegisterForEventValidation(TheGrid.UniqueID, "Select$" & row.RowIndex)
        End If
    Next
    MyBase.Render(writer)
End Sub

这样ASP.NET会认可每个行的选择回传参数,不会再抛出验证异常。

方案二:使用GridView内置选择功能(更简洁,推荐)

直接利用GridView自带的选择按钮,ASP.NET会自动处理事件验证,无需手动注册参数:

  1. 修改ASPX页面的GridView列配置,添加内置选择按钮:
<asp:GridView runat="server" ID="TheGrid" AutoGenerateColumns="false" DataKeyNames="id" EmptyDataText="No Data Found" AllowSorting="true">
    <Columns>                               
        <asp:CommandField ShowSelectButton="true" SelectText="选择" />
        <asp:BoundField DataField="FirstName" HeaderText="First Name" ReadOnly="true" SortExpression="FirstName" />
        <asp:BoundField DataField="LastName" HeaderText="Last Name" ReadOnly="true" SortExpression="LastName" />
        <asp:BoundField DataField="Email" HeaderText="Email" ReadOnly="true" SortExpression="Email" />
    </Columns>
</asp:GridView>
  1. 若需要整行点击触发选择,保留RowDataBound方法,修改回传脚本指向内置选择按钮:
Protected Sub TheGrid_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles TheGrid.RowDataBound
    If e.Row.RowType = DataControlRowType.DataRow Then
        ' 获取行内的选择按钮,生成回传脚本
        Dim selectBtn As LinkButton = CType(e.Row.Cells(0).Controls(0), LinkButton)
        e.Row.Attributes("onclick") = Page.ClientScript.GetPostBackClientHyperlink(selectBtn, "")
        e.Row.Attributes("style") = "cursor:pointer"
    End If
End Sub

关键注意事项

  • 确保GridView的数据绑定逻辑正确:若允许排序,需在Sorting事件中重新绑定数据;首次加载仅在Not IsPostBack时绑定,回传时无需重复绑定(除非有特殊需求)。
  • 事件验证是ASP.NET的安全机制,禁止关闭EnableEventValidation="false",避免潜在的注入攻击风险。

内容的提问来源于stack exchange,提问作者Don Del Grande

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 06:20:32