2012-06-05 2 views
0

Я думал, что если пользовательская сделанная переменная ViewState всегда доступна на каждом посещении страницы (тот же сеанс браузера) (например, Session, но на стороне клиента) или только на обратной стороне страницы? Я знаю, что это данные на стороне клиента, которые всегда инкапсулируются пакетом Request и пакетом Response с сервера.переменная viewstate всегда доступна?

Я проверял это прямо сейчас, и я сделал следующее:

на Home.aspx:

protected void Page_Load(object sender, EventArgs e) 
{ 
    ViewState["test"] = "test1"; 
} 
protected void Button1_Click(object sender, EventArgs e) 
{ 
    string test = ViewState["test"].ToString(); 

    Server.Transfer("Default.aspx"); 
} 

И Default.aspx:

protected void Page_Load(object sender, EventArgs e) 
{ 
    string test = ViewState["test"].ToString(); 
} 

Но я получаю NullReferenceException , Таким образом, это означает, что ViewState["test"] не существует, потому что ViewState полностью новый и регенерированный. Поэтому я пришел к выводу, что вы можете использовать переменные ViewState только при выполнении обратной передачи формы (но на самом деле вы всегда перенаправляете после обратной передачи формы, поэтому я не могу использовать ViewState всегда ...).

Я прав, с моим мнением?

ответ

3

ViewState может быть настроен по-разному, с разными (или обычными) провайдерами или может быть полностью отключен. Однако поставщик по умолчанию - это поле формы, поэтому да: в этом по умолчанию конфигурация случае он будет существовать только в POST и не будет существовать для GET. Передача действует по существу как GET.

Если вам нужны данные между несвязанными страницами, но связанные с пользователем - используйте сеансовое состояние или что-то в cookie-based.

В новостях не связанных: состояние взгляда довольно ужасно по-разному - подумайте о котятах!

1

Что вы здесь сделали, наткнулись на одну из основных точек понимания в ASP.NET Web Forms и то, как она абстрагирует отсутствие HTTP-статуса без гражданства.

Разница между сесии переменных и VIEWSTATE прост:

  • Session хранится на стороне сервера, и он произвел, когда браузер возвращает признанную печенье
  • ViewState хранится полностью на стороне клиента в пределах скрытых <input> теги, означает, что они передаются свежими при каждой обратной передаче

Как вы испытали Сессия может жить на разных страницах, тогда как Viewstate доступен только при размещении на той же странице.

+0

Так я прав с моим утверждением? спасибо за ваш комментарий – Ozkan

+0

Да, я верю, что вы пришли к правильному выводу –

0

Использование Page_PreRender, Page_Load перед тем, как viewstate находится в состоянии использования IIRC.

+1

Вы не правы, 'ViewState' уже загружен в' Page_Load' – Ozkan

1

Если вы используете HttpServerUtility.Transfer Method (String, Boolean) с параметром url и true, то он сохранит коллекции QueryString и Form. Но все же вы не можете напрямую обращаться к ViewState со 2-й страницы.Вот способ доступа к состоянию просмотра.

Home.aspx:

protected void Page_Load(object sender, EventArgs e) 
{ 
    ViewState["test"] = "test1"; 
} 

protected void Button1_Click(object sender, EventArgs e) 
{ 
    Server.Transfer("Default.aspx", true); 
} 

// adding this method to return view state 

public StateBag ReturnViewState() 
{ 
    return ViewState; 
} 

Default.aspx: здесь с помощью ПредыдущаяСтраница мы можем вызвать метод на этой странице и получить состояние просмотра

private StateBag PreviousPageViewState 
{ 
    get 
    { 
     StateBag returnValue = null; 
     if (PreviousPage != null) 
     { 
      Object objPreviousPage = (Object)PreviousPage; 
      MethodInfo objMethod = objPreviousPage.GetType().GetMethod 
        ("ReturnViewState"); 
      return (StateBag)objMethod.Invoke(objPreviousPage, null); 
     } 
     return returnValue; 
    } 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (PreviousPage != null) 
    { 
     if (PreviousPageViewState != null) 
     { 
      var text = PreviousPageViewState["test"].ToString(); 
     } 
    } 
} 
Смежные вопросы