asp.net 如何在不禁用EnableEventValidation的情况下在ASP GridView中启用行选择?

pqwbnv8z  于 2022-11-19  发布在  .NET
关注(0)|答案(1)|浏览(179)

我有一个包含GridView的ASPX页。我希望能够从网格中选择一行,并基于所选行填充该页的另一部分。如果在〈%@ Page %〉行中设置EnableEventValidation=“false”,该功能就可以正常工作,但我被告知由于安全问题而无法使用该功能。如果不包含该功能,选择网格行会引发“回发或回调参数无效”异常。
如何在不禁用事件验证的情况下实现行选择?
下面是我的代码:
ASPX页面:

<asp:GridView runat="server" ID="TheGrid" AutoGenerateColumns="false" DataKeyNames="id" EmptyDataText="No Data Found" AllowSorting="true">
    <Columns>                               
        <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>

ASPX.VB代码:

Protected Sub TheGrid_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles TheGrid.RowDataBound
    If e.Row.RowType = DataControlRowType.DataRow Then
        e.Row.Attributes("onclick") = Page.ClientScript.GetPostBackClientHyperlink(TheGrid, "Select$" & e.Row.RowIndex)
        e.Row.Attributes("style") = "cursor:pointer"
    End If
End Sub

Protected Overrides Sub Render(writer As HtmlTextWriter)
    ClientScript.RegisterForEventValidation("TheGrid")
    MyBase.Render(writer)
End Sub

请注意,当我选择一行时,在Page_Load和Render之间的某个位置引发了异常。

ctehm74n

ctehm74n1#

好吧,让我们用两种方式连接GV。
第一种方法,在平面上放置一个jane按钮,用于行单击(我们将在第二个示例中删除按钮并添加行单击)。
那么,假设这个简单GV

<div id="MyGridArea" runat="server" clientidmode="static">
    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
        DataKeyNames="ID"
        CssClass="table table-hover" Width="60em" GridLines="None"
        ShowHeaderWhenEmpty="true">
        <Columns>
            <asp:BoundField DataField="FirstName" HeaderText="FirstName" />
            <asp:BoundField DataField="LastName" HeaderText="LastName" />
            <asp:BoundField DataField="City" HeaderText="City" />
            <asp:BoundField DataField="HotelName" HeaderText="HotelName" />
            <asp:BoundField DataField="Description" HeaderText="Description" />
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:Button ID="cmdEdit" runat="server" Text="Edit" CssClass="btn myshadow"
                        OnClick="cmdEdit_Click" />
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
</div>

注意我们是如何在飞机上降落的简巴顿。
我们的代码是这样的:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then
        LoadGrid()
    End If

End Sub

Sub LoadGrid()
    Dim strSQL = "SELECT * FROM tblHotelsA ORDER BY HotelName"

    GridView1.DataSource = Myrst(strSQL)
    GridView1.DataBind()

End Sub

现在我们有了这个:

好的,接下来的部分是放入一个“div”区域,允许编辑一行。
简控制了很多计划。
并且我们可以在编辑时“隐藏”网格,并显示编辑区域div。
但是,我经常使用jQuery. UI。实际上与简单的hide/show代码非常相似,但是jQuery.UI将相同的div转换为一个漂亮的弹出区域。
因此,div区域可能如下所示:

<div id="EditRecord" runat="server" style="float: left; display: none" clientidmode="Static">

            <br />
            <div style="float: left" class="iForm">

                <label>HotelName</label>
                <asp:TextBox ID="txtHotel" runat="server" f="HotelName" Width="280">
                </asp:TextBox>
                <br />
                <label>First Name</label>
                <asp:TextBox ID="tFN" runat="server" f="FirstName" Width="140"></asp:TextBox>
                <br />
                <label>Last Name</label>
                <asp:TextBox ID="tLN" runat="server" f="LastName" Width="140"></asp:TextBox>
                <br />

                <label>City</label>
                <asp:TextBox ID="tCity" runat="server" f="City" Width="140"></asp:TextBox>

                <br />
                <label>Province</label><asp:TextBox ID="tProvince" runat="server" f="Province" Width="75"></asp:TextBox>
            </div>

等等等等等等。
所以,现在让我们把上面的按钮连接起来。
按钮将简单:
获取当前网格行
获取主键id
加载div并显示。
代码如下:

Protected Sub cmdEdit_Click(sender As Object, e As EventArgs)

    Dim btn As Button = sender
    Dim gRow As GridViewRow = btn.NamingContainer
    EditRow(gRow.RowIndex)

End Sub

Sub EditRow(rowNum As Integer)

    Dim intPK As Integer = GridView1.DataKeys(rowNum).Item("ID")
    Dim strSQL As String = "SELECT * FROM tblHotelsA WHERE ID = " & intPK

    Dim rstData As DataTable = Myrst(strSQL)

    ' load up our edit div
    fLoader(Me.EditRecord, rstData.Rows(0))
    ViewState("PK") = intPK

    ScriptManager.RegisterStartupScript(Me.Page, Page.GetType, "mypopedit", "popedit()", True)

End Sub

如前所述,我从jQuery.UI添加了一个弹出窗口,但我们可以只使用普通的jane“div”,隐藏/显示网格并显示编辑区域(或者像您一样,让编辑区域处于全视图状态)。
(fLoader是我前段时间构建的一个例程--我喜欢每个人都变得非常厌倦了一遍又一遍地键入代码来填写文本框等,所以对于任何文本框等,我使用一个名为f=“数据库列名”的“组成”属性,该例程只会循环表单上的控件并填写它们。这与手工编写简单的控件赋值没有什么不同,但是有了这段代码,我可以反复使用它。
于是,我们现在看到,得到这样的结论:

好了,接下来的唯一目标是添加一个行单击(而不是使用编辑按钮)。
因此,我们所需要的就是一个例程,它将获取当前行索引,并调用上面的编辑行例程。
因此,我们使用行数据绑定,并以这种方式添加click事件。
但是,请注意上面的按钮点击是如何得到当前行的。这段代码很短,适用于repeaters,listview等(我们使用了命名容器)。
但是,如果您想要一行单击来代替该按钮呢?
然后在数据行数据绑定上,添加以下代码:

Protected Sub GridView1_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GridView1.RowDataBound

    If e.Row.RowType = DataControlRowType.DataRow Then

        e.Row.Attributes.Add("onclick",
             "__doPostBack('myrowedit'," & e.Row.RowIndex & ")")

    End If

End Sub

在页面加载事件中,我们有以下内容:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then
        LoadGrid()
    Else
        If Request("__EVENTTARGET") = "myrowedit" Then
            EditRow(Request("__EVENTARGUMENT"))
        End If
    End If

End Sub

下面是一个很好的例程,它根据我上面使用的SQL返回一个表:

Public Function Myrst(strSQL As String) As DataTable

    Dim rstData As New DataTable
    Using mycon As New SqlConnection(My.Settings.TEST4)

        Using cmdSQL As New SqlCommand(strSQL, mycon)
            mycon.Open()
            rstData.Load(cmdSQL.ExecuteReader)
        End Using

    End Using

    Return rstData

End Function

所以,总而言之,代码不多。
您可以在此处尝试上面的工作示例:
http://www.kallal.ca/Website11/WebForm2

相关问题