Как сохранить переменную на обратной стороне
Я создал одну страницу (с кодом позади .vb) и создал Public intFileID As Integer
в загрузке страницы я проверяю запрос и задаю его, если он доступен, или установите intFileID = 0.
Public intFileID As Integer = 0
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
If Not Request.QueryString("fileid") Is Nothing Then
intFileID = CInt(Request.QueryString("fileid"))
End If
If intFileID > 0 Then
GetFile(intFileID)
End If
End If
End Sub
Private Sub GetFile()
'uses intFileID to retrieve the specific record from database and set the various textbox.text
End Sub
Для кнопки "Отправить" есть событие click, которое вставляет или обновляет запись, основанную на значении переменной intFileID. Мне нужно уметь сохранять эту ценность при обратной передаче, чтобы все это работало.
Страница просто вставляет или обновляет запись в базе данных SQL. Я не использую gridview, formview, detailview или любой другой объект типа Rad, который сохраняет ключевое значение сам по себе, и я не хочу использовать их.
Как я могу сохранить значение, установленное в intFileID, не создавая что-то в HTML, которое можно было бы изменить.
[EDIT] Изменен Page_Load, чтобы использовать ViewState для сохранения значения intFileID
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
If Not Request.QueryString("fileid") Is Nothing Then
intFileID = CInt(Request.QueryString("fileid"))
End If
If intFileID > 0 Then
GetFile(intFileID)
End If
ViewState("intFileID") = intFileID
Else
intFileID = ViewState("intFileID")
End If
End Sub
Ответы
Ответ 1
Как указывали другие, вы можете сохранить его в сеансе или в ViewState. Если это определенная страница, мне нравится хранить ее в ViewState, в отличие от сеанса, но я не знаю, является ли один метод предпочтительнее другого.
В VB вы сохраните элемент в ViewState, например:
ViewState(key) = value
И получить его как:
value = ViewState(key)
Ответ 2
Просто, чтобы суммировать сказанное выше.
Вы можете использовать Session, Viewstate или скрытое поле.
Я лично предпочитаю viewstate, поскольку он будет работать в средах веб-ферм, Session не работает, он не хранит его на сервере, ожидающем пользователя, на удаление до 20 минут, и в общем случае viewstate это место для для данных уровня страницы.
Вы можете использовать скрытое поле, но тогда пользователь может более легко его изменить.
Ответ 3
Сохраните его в сеансе.
Page.Session["MyPage_FileID"] = intFileID
Вам нужно будет иметь логику, управляющую ею, когда пользователь перемещается, но если она всегда задается, когда страница загружается из GET (или вы ее очищаете, если она недоступна в GET), вы должны быть в порядке, используя это позже из Сессии на вашем отправке PostBack.
Ответ 4
Сохранить в:
- Session
- ViewState
- Скрытый ввод
Ответ 5
Помните:
Каждый раз, когда запускается ваш код сервера, он отображается в новом экземпляре вашего класса. Это для каждой обратной передачи.
Ответ 6
На самом деле, так как страница ASP.NET обращается к себе - включая строку запроса - вы можете просто удалить условие If Not Page.IsPostBack
. Тогда он установил бы себя на каждой обратной передаче.
Ответ 7
Я лично решил сохранить значение в состоянии управления вместо viewstate, так как viewstate можно легко отключить. ControlState будет сохраняться, даже если viewstate выключен по какой-либо причине. Я привел пример о том, как это можно сделать.
Private intFileId As Integer = 0
Public Property FileID() As Integer
Get
Return intFileId
End Get
Set(ByVal value As Integer)
intFileId = value
End Set
End Property
Protected Overrides Function SaveControlState() As Object
Dim objState(2) As Object
objState(0) = MyBase.SaveControlState()
objState(1) = Me.FileID
Return objState
End Function
Protected Overrides Sub LoadControlState(ByVal savedState As Object)
Dim objState() As Object
objState = savedState
MyBase.LoadControlState(objState(0))
Me.FileID = CInt(objState(1))
End Sub
Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
Me.Page.RegisterRequiresControlState(Me)
End Sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Page.IsPostBack Then
If Not String.IsNullOrEmpty(Request.QueryString("fileid")) Then
Me.FileID = CInt(Request.QueryString("fileid"))
End If
End If
Response.Write(Me.FileID.ToString())
End Sub
Ответ 8
Session["KeyName"] = your value;
- Введите тип для получения и сохранения данных из сеанса, как показано ниже:
Datatable dt = (DataTable)(Session["KeyName"]);
или
ViewState["KEY"]= value;
- Введите тип для получения и сохранения данных из сеанса, как показано ниже:
String str = (String)ViewState["KEY"];
Ответ 9
Я буду использовать Session как предложенный tvanfosson.
ViewState и HiddenField могут быть слишком тяжелыми, если вы хотите хранить большие данные, такие как набор данных для комментариев, на страницах темы форума.