几天来我一直在搜索论坛并试图解决这个问题,但我被卡住了。如果这是我错过的如此简单和明显的事情,我深表歉意。尽管我发现了与我的问题相似的帖子,但它们并不完全相同。
以下是我的 Web 应用程序部分功能的概要:
- 显示一个简单的 asp:dropdownlist
当用户选择一个值时,相应的更新面板是可见的(这些更新面板在后面的 Page_Load 代码中是可见的 = false ),显示一个可编辑的网格视图:
Protected Sub DropDownList1_SelectedIndexChanged(sender As Object, e As EventArgs) If DropDownList1.SelectedItem.Value <> "0" Then If DropDownList1.SelectedValue = "Activate or Inactivate Users" Then UpdatePanel1.Visible = True End If ...
<asp:GridView ID="GridView3" runat="server" AllowSorting="True" AutoGenerateColumns="False" AutoGenerateEditButton="True" DataSourceID="SqlDataSource2"> <Columns> <asp:BoundField DataField="iMemberId" HeaderText="iMemberId" InsertVisible="False" ReadOnly="True" SortExpression="iMemberId" /> <asp:BoundField DataField="sFname" HeaderText="sFname" SortExpression="sFname" /> <asp:BoundField DataField="sSname" HeaderText="sSname" SortExpression="sSname" /> <asp:BoundField DataField="dDateCreated" HeaderText="dDateCreated" SortExpression="dDateCreated" /> <asp:BoundField DataField="sEmailAddress" HeaderText="sEmailAddress" SortExpression="sEmailAddress" /> <asp:BoundField DataField="sMobileNo" HeaderText="sMobileNo" SortExpression="sMobileNo" /> <asp:CheckBoxField DataField="bActiveMember" HeaderText="bActiveMember" SortExpression="bActiveMember" /> </Columns> </asp:GridView> <asp:SqlDataSource ID="SqlDataSource2" Runat="server" ConnectionString="<%$ ConnectionStrings:PTCCHomeTestConnectionString %>" SelectCommand="SELECT * FROM [MemberTable] ORDER BY [sSname]" UpdateCommand="UPDATE MemberTable SET sFname = @sFname, sSname = @sSname, sEmailAddress = @sEmailAddress, sMobileNo =, bActiveMember = WHERE (iMemberId = @iMemberId)"> <UpdateParameters> <asp:Parameter Name="sFname" /> <asp:Parameter Name="sSname" /> <asp:Parameter Name="sEmailAddress" /> <asp:Parameter Name="iMemberId" /> </UpdateParameters> </asp:SqlDataSource> </ContentTemplate>
每个 gridview 的选择和更新查询都已经过测试并且工作正常。我已经在一个页面中测试了它们都可见的网格视图(并且一切正常,但我希望根据用户从下拉列表中选择的唯一一个合适的网格视图可见。
- 然后,用户应该能够单击所选行上的编辑并更新它。网格视图显示正常,填充正确,但是当用户连续单击编辑(更新)链接时,出现错误:
“无效的回发或回调参数。事件验证在配置中启用或在页面中使用 <%@ Page EnableEventValidation="true" %>...
堆栈跟踪:
[ArgumentException:回发或回调参数无效。使用配置或页面启用事件验证。出于安全目的,此功能验证回发或回调事件的参数是否源自最初呈现它们的服务器控件。如果数据有效且符合预期,请使用 ClientScriptManager.RegisterForEventValidation 方法注册回发或回调数据以进行验证。] System.Web.UI.ClientScriptManager.ValidateEvent(字符串唯一标识,字符串参数)+144 System.Web.UI.Control.ValidateEvent(字符串唯一ID,字符串事件参数)+111 System.Web.UI.WebControls.GridView.RaisePostBackEvent(字符串 eventArgument)+32 System.Web.UI.WebControls.GridView.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(字符串 eventArgument)+13 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +9643314 System.Web.UI.Page.ProcessRequestMain(布尔 includeStagesBeforeAsyncPoint,布尔 includeStagesAfterAsyncPoint)+1724 版本信息:Microsoft .NET Framework 版本:4.0.30319;ASP.NET 版本:4.0.30319.17929"`
我已经尝试了以下(但仍然是同样的错误):
我添加了一个 Render 子程序,它注册了 select 和 update 中的所有值以进行事件验证:
Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
'override (page) Render and loop over the GridView Rows
Dim row As GridViewRow
For Each row In GridView3.Rows
If (row.RowType = DataControlRowType.DataRow) Then
Page.ClientScript.RegisterForEventValidation(New System.Web.UI.PostBackOptions(Me.GridView3, "Select$" + row.RowIndex.ToString()))
Page.ClientScript.RegisterForEventValidation(New System.Web.UI.PostBackOptions(Me.GridView3, "Update$" + row.RowIndex.ToString()))
End If
Next
MyBase.Render(writer)
...
我还尝试重新绑定gridview和数据源:
If Not (IsPostBack) Then
SqlDataSource2.DataBind()
GridView3.DataBind()
End If
我还尝试在 Page 标记中添加 EnableEventValidation="false"。发生的情况是我现在可以按编辑链接,但随后 UpdatePanel 消失(根据 Page_Load),然后当我从下拉列表中选择值时,它再次出现在编辑模式下的行,但用空白而不是行的当前值。
我还尝试在 gridview 所在的同一 updatePanel 之外定义 gridview 的数据源,但这没有任何区别。
只是为了确认一下,如果我没有在 Page_Load 代码中使 UpdatePanels visible=false 以便用户可以看到所有这些,那么 gridviews 可以很好地更新行。这使我认为问题在于无状态,好像我理解正确一样,当按下 Edit 链接时,再次调用 Page_Load 代码并且不再保留 dropdownlistvalue,从而使 gridview 所在的 updatepanel 再次可见 = false .
那么,有没有其他方法可以根据不是 Page_Load 的下拉列表选择隐藏更新面板?这可能是解决方案所在吗?
或者在编辑链接(Page_Load 调用)完成后让下拉列表选择的值保持不变的另一种方法?
我认为我走在正确的轨道上,但获得一些指导会很有帮助。