Должен ли я хранить поле идентификатора базы данных во ViewState?

StackOverflow https://stackoverflow.com/questions/103000

  •  01-07-2019
  •  | 
  •  

Вопрос

Мне нужно получить запись из базы данных, отобразить ее на веб-странице (я использую ASP.NET), но сохранить где-то идентификатор (первичный ключ) этой записи, чтобы позже вернуться к базе данных с этим идентификатором ( возможно, сделать обновление).

Я знаю, что, вероятно, есть несколько способов сделать это, например сохранение идентификатора в ViewState или скрытом поле, но какой метод лучше всего и по каким причинам я могу выбрать этот метод среди других?

Это было полезно?

Решение

Это зависит.

Вас волнует, увидит ли кто-нибудь идентификатор записи?Если да, то ни скрытые поля, ни состояние просмотра не подходят;вам нужно сохранить его в состоянии сеанса или зашифровать состояние просмотра.

Вас волнует, если кто-то отправит форму с поддельным идентификатором?Если вы это сделаете, вы не сможете использовать скрытое поле (и вам нужно будет рассмотреть защиту CSRF в качестве бонуса).

Вы хотите, чтобы оно оставалось неизменным, но не заботитесь о том, чтобы оно было открыто для просмотра (с некоторой доработкой)?Используйте viewstate и установите EnableViewStateMac="true" на своей странице (или глобально)

Хотите, чтобы оно было скрыто и защищено, но не можете использовать состояние сеанса?Зашифруйте свое состояние просмотра, установив следующие записи web.config.

<pages enableViewState="true" enableViewStateMac="true" />
<machineKey ... validation="3DES" />

Другие советы

Вы хотите, чтобы конечный пользователь знал идентификатор?Например, если значение id представляет собой стандартное начальное значение 1,1 из базы данных, я мог бы посмотреть на число и узнать, сколько у вас клиентов.Если вы зашифруете значение (как это может сделать состояние просмотра), мне будет гораздо сложнее расшифровать ключ (но не невозможно).

Альтернативой является сохранение его в сеансе, это приведет к (очень небольшому, если это просто целое число) снижению производительности вашего приложения, но это означает, что я, как пользователь, никогда не увижу этот первичный ключ.Он также предоставляет объект другим частям вашего приложения, которым вы можете или не хотите, чтобы он был доступен (объекты сеанса остаются до тех пор, пока не будут очищены, не пройдет заданное время (например, 5 минут) или не закроется окно браузера - в зависимости от того, что произойдет раньше .

Значения состояния просмотра вызывают дополнительную нагрузку на клиент после каждого обратного сообщения, поскольку состояние просмотра не только сохраняет объекты для страницы, но и запоминает объекты, если вы используете кнопку «Назад».Это означает, что после каждого поста его состояние просмотра становится немного больше и его сложнее использовать.Они будут существовать на странице только до тех пор, пока браузер не перейдет на другую страницу.

Всякий раз, когда я сохраняю идентификатор на такой странице, я всегда создаю свойство

public int CustomerID {
    get { return ViewState("CustomerID"); }
    set { ViewState("CustomerID") = value; }
}

или

    Public Property CustomerID() As Integer
        Get
            Return ViewState("CustomerID")
        End Get
        Set(ByVal value As Integer)
            ViewState("CustomerID") = value
        End Set
    End Property

Таким образом, если вы решите изменить его с Viewstate на переменную сеанса или скрытое поле формы, это всего лишь случай изменения его в ссылке на свойство, остальная часть страницы может получить доступ к переменной, используя «Page.CustomerID».

ViewState — это вариант.Это действительно только для той страницы, на которой вы находитесь.Он не передает запросы к другим ресурсам, таким как объект Session.

Скрытые поля тоже работают, но вы передаете немного информации о своем приложении любому, кто достаточно умен, чтобы просмотреть исходный код вашей страницы.

Вы также можете сохранить всю свою запись в ViewState и, возможно, избежать повторного обращения к серверу.

Лично я очень настороженно отношусь к включению чего-либо в сессию.Слишком много раз наши рабочие процессы зацикливались, и мы теряли состояние сеанса.

Когда вы описали свою проблему, я бы поместил ее в скрытое поле или в состояние просмотра страницы.

Кроме того, при определении того, куда поместить подобные данные, всегда обращайте внимание на объем данных.Охватывается ли он одной страницей или всем сеансом?Если для нас ответом является «сеанс», мы помещаем его в файл cookie.(Отказ от ответственности:Мы пишем приложения для интранета, в которых, как мы знаем, включены файлы cookie.)

Если это простой идентификатор, вы решите передать его в строке запроса, тогда вам не нужно будет выполнять обратную передачу, и страница станет более доступной для пользователей и поисковых систем.

Session["MyId"]=myval;

Это было бы немного безопаснее и, по сути, предлагает ту же механику, что и помещение в состояние просмотра.

Я склонен размещать подобные вещи в скрытых полях, просто сделайте немного

 <asp:label runat=server id=lblThingID visible=false />
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top