Фон :
У меня есть GridView, который заполняется из SqlDataSource через DataSourceID.Строки показывают некоторые сводные данные из представления SQL.Нажав на строку, я хотел бы перевести моего пользователя на другую страницу с элементом управления DetailsView, который заполняется полным набором значений из БД, связанных с выбранной строкой.Мой пользователь должен иметь возможность редактировать данные, загружать файлы, связанные с этой записью, и создавать новую запись другого типа на основе указанных данных.
Ошибка :
Все примеры, которые я нашел для строк Clickable GridView, заканчиваются некоторым изменением ошибки Invalid postback or callback argument. Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page.
Естественно, я не хочу подвергать свой сайт уязвимостям, отключив проверку событий.Мне нужно иметь возможность получить первичный ключ связанной записи выбранной строки и выполнить операции над этими данными на следующей странице, возможно, через DetailsView.Я подозреваю, что мои ошибки являются результатом моей настройки, поэтому я включил эти данные.
Мои вопросы :
- Как мне записать основнойКлюч строки, по которой щелкнули?
- Как, по щелчку, перейти на страницу «Подробности» с предварительно заполненной формой, содержащей данные из записи строки, по которой был выполнен щелчок?
ЗДЕСЬПОЛНОЕ РЕШЕНИЕ
** еще раз спасибо помощи Икара
'Fetch the DataKey ("ID"), seems to work
Protected Sub RowBind(ByVal sender As Object, ByVal e As GridViewRowEventArgs) _
Handles GridView1.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
Dim datakey As String = GridView1.DataKeys(e.Row.RowIndex).Value.ToString()
End If
End Sub
'Handle button click
Protected Sub RowClick(ByVal sender As Object, ByVal e As GridViewCommandEventArgs) _
Handles GridView1.RowCommand
If e.CommandName = "Select" Then
'Add to session variable; translate the index of clicked to Primary Key
Session.Add("DetailsKey", GridView1.DataKeys(e.CommandArgument).Value.ToString)
Response.Redirect("details.aspx")
End If
End Sub
и моей разметке
<asp:GridView ID="GridView1" runat="server" DataSourceID="GridView1SDS"
DataKeyNames="ID" AllowPaging="True" AllowSorting="True">
'<!-- Styling -->
<Columns>
<asp:ButtonField ButtonType="Button" Text="Details" CommandName="Select" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="GridView1SDS" runat="server"
ConnectionString="<%$ ConnectionStrings:dbConnectionString %>"
SelectCommand="select * from viewRequestQueue">'<!-- An SQL View -->
</asp:SqlDataSource>
перенаправленная страница VB и разметка
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
GridView2SDS.SelectCommand = "select * from viewRequestQueue where ID = " _
+ Session.Item("DetailsKey").ToString
End If
End Sub
<asp:DetailsView ID="GridView2" runat="server" DataSourceID="GridView2SDS">
'<!-- Styling -->
</asp:DetailsView>
<asp:SqlDataSource ID="GridView2SDS" runat="server"
ConnectionString="<%$ ConnectionStrings:dbConnectionString %>">
</asp:SqlDataSource>
Кроме того, обратите внимание, что если SelectCommand
для вашего DataSource обрабатывается в codebehind, это означает, что DataBind перезапишет ваш <Columns>
в разметке.Чтобы обойти это, вы должны определить столбцы в коде перед DataBind.Допустим, я хотел добавить еще один столбец ButtonField на перенаправленную страницу (обратите внимание, что SelectCommand не указан в разметке), я добавил следующее перед настройкой SelectCommand и выполнением DataBind:
Dim id As New ButtonField()
id.ButtonType = ButtonType.Button
id.Text = "Load"
id.CommandName = "Select"
PubDetails.Columns.Add(id)