2012-05-01 5 views
1

У меня есть многопользовательская версия и есть 2 вида внутри. Я собираюсь вставить пример кода.Передача значений с использованием viewstate через postback в multiview

<asp:MultiView ID="MultiView1" ActiveViewIndex="0" runat="server"> 
<asp:View ID="View1" runat="server"> 
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 
    <asp:Button ID="Button1" runat="server" Text="view1" /> 
    <asp:Label ID="Label2" runat="server" ></asp:Label> 
</asp:View> 
<asp:View ID="View2" runat="server"> 
    <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox> 
    <asp:Button ID="Button2" runat="server" Text="view2" /> 
</asp:View> 
</asp:MultiView> 

Я хочу, чтобы значение в txtbox1 находилось в обратной передаче. Хотя multiviews поддерживают состояние, я делаю response.redirect, чтобы передать querystring для view2. Поскольку я делаю postback, я не могу использовать значение в txtbox1 (в представлении1), в view2. Значение в txtbox1 становится нулевым во время обратной передачи. Я попытался следующий код

Public Partial Class viewstatetest 
Inherits System.Web.UI.Page 

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
If (Not Page.IsPostBack()) Then 
    MultiView1.ActiveViewIndex = 0 
Else 
    TypedPassword = TextBox1.Text 
    TextBox1.Attributes.Add("value", TypedPassword) 
End If 
End Sub 

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click 
MultiView1.ActiveViewIndex = 1 
End Sub 

Protected Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click 
MultiView1.ActiveViewIndex = 0 
Label1.Text = TextBox1.Text 
Response.Redirect("viewstatetest.aspx") 
End Sub 

Public Property TypedPassword() As String 
Get 
    If (ViewState("TypedPassword") IsNot Nothing) Then 
     Return CStr(ViewState("TypedPassword")) 
    End If 
    Return "" 
End Get 
Set(ByVal value As String) 
    ViewState("TypedPassword") = value 
End Set 
End Property 
End Class 

При загрузке страницы в первый раз, я что-то типа в txtbox1 в view1 и нажмите на кнопку, view2 загружен и у меня есть код, который получает значение txtbox1 и записывает значение inlabel1 в view1. И когда я делаю response.redirect, textbox1 становится null, а view также становится нулевым.

Почему нет значения в viewstate?

Спасибо!

ответ

4

Asp.Net viewstate очень отличается от обычных запросов браузера get/post в других системах, таких как Rails, PHP или даже Asp.Net MVC.

Вот что происходит в вашем сценарии: браузер

  1. пользователя делает HTTP GET на странице в первый раз. Это не обратная передача.
  2. Пользователь заполняет TextBox1 и нажимает кнопку Button1. Это postback (HTTP post).
  3. На сервере информация в зашифрованной скрытой переменной __VIEWSTATE распакована и сравнивается с новыми значениями для TextBox1 и Button1 в соответствии с данными сообщения в запросе.
  4. Asp.Net определяет изменения состояния и запускает события в вашем коде сервера. Это приводит к изменению индекса активного просмотра на 1.
  5. Теперь браузер получает страницу с показанным 2.
  6. Пользователь обращается к Button2. Это postback (HTTP post).
  7. Сервер проходит тот же процесс, что и перед сопоставлением viewstate для публикации данных и запускает событие Button2 click.
  8. Ваш код теперь делает что-то другое. Когда вы выполняете Response.Redirect, сервер не отправляет страницу с новым представлением. Вы отправляете короткий заголовок без сохраненной информации о представлении в скрытой переменной формы. Переадресация заставляет браузер немедленно выполнять операцию HTTP get с указанным URL. ЭТО НЕ ПОЧТА, и состояние представления потеряно. Это точно такой же сценарий, как и первый HTTP-доступ из браузера пользователя на этапе 1.

Надеюсь, это поможет. Я считаю, что можно с уверенностью признать, что Microsoft признала недостатки своей модели viewstate в Asp.net. Это довольно сложно реализовать сексуальные, современные приложения ajax, где браузер поддерживает большую часть состояния приложения и просто хочет сделать небольшие запросы на новые данные с сервера. Я думаю, что это одна из основных мотивов отказа от модели viewstate в Asp.Net MVC.

+0

На самом деле, я бы сказал, что viewstate было «заброшено», потому что MVC не имеет серверных элементов управления, что и использует viewstate в первую очередь. –

+0

100% согласен. Курица и яйца. – randomfactor

+0

Buck-AWK! Хороший анализ того, что происходит в противном случае, кстати. +1 –