GridView Row Redirect для предварительно заполненного DetailsView при нажатии кнопки - PullRequest
0 голосов
/ 19 октября 2011

Фон :

У меня есть 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.Я подозреваю, что мои ошибки являются результатом моей настройки, поэтому я включил эти данные.

Мои вопросы :

  1. Как мне записать основнойКлюч строки, по которой щелкнули?
  2. Как, по щелчку, перейти на страницу «Подробности» с предварительно заполненной формой, содержащей данные из записи строки, по которой был выполнен щелчок?

ЗДЕСЬПОЛНОЕ РЕШЕНИЕ

** еще раз спасибо помощи Икара

'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)

1 Ответ

2 голосов
/ 19 октября 2011

Вам необходимо объявить KeyNames элементов, которые вы связываете в вашей разметке.Например:

<asp:GridView id="grid" runat="Server" DataSourceID="YourSQLDataSource" DataKeyNames="ID,Name" />

В вашем случае вы, похоже, обрабатывали событие OnRowDataBound.Вы можете сделать это, чтобы получить ключ внутри RowBound:

If e.Row.RowType = DataControlRowType.DataRow Then
  Dim datakey As String = GridView1.DataKeys(e.Row.RowIndex).Value.ToString()  'get the datakey
End If

На ваш второй вопрос сложно ответить, потому что вы не указали, как вы хотите, чтобы пользователь перенаправлялся, со стороны клиента с использованием Javascript илиСерверная сторона.Вы также не указали, как вы ожидаете, чтобы заполнить детали на странице Подробности.Ожидаете ли вы прочитать параметр из URL и использовать его для получения сведений о записи из базы данных?

...