2015-11-25 3 views
0

Я пытаюсь использовать ViewState для сохранения ввода моего текстового поля во время обратной передачи. Вот код:Код ASPX за ViewState не сохраняется

private Label store_Incident_Number = new Label(); 
private TextBox Incident_Number = new TextBox(); 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (ViewState["Incident_Number"] != null) 
     {     
      store_Incident_Number.Text = "TEST" + (string)ViewState["Incident_Number"]; 
      Panel1.Controls.Add(store_Incident_Number); 
     } 
    } 

    void Page_PreRender(object sender, EventArgs e) 
    { 
     ViewState.Add("Incident_Number", Incident_Number.Text); 

    } 

код, расположенный в моем default.aspx.cs (код позади). Panel1 - это asp control, где на веб-странице вне тега формы. Я пытаюсь следовать этому примеру: https://msdn.microsoft.com/en-us/library/ms227551(v=vs.85).aspx

Я надеялся, что текст текстового поля Incident_Number сохраняется на ярлыке после того, как страница отправлена ​​обратно, но она не работает, и я не мог понять проблему. Обратите внимание, что текстовое поле динамически добавляется к форме страницы и воссоздается каждый ответ. Мой вопрос заключается в том, как я кодирую, чтобы сохранить значение текстового поля после того, как страница будет отправлена ​​обратно?

EDIT: Исправлено! См. Мой принятый ответ. Кроме того, любой обработчик событий или другой процесс, который может инициировать другой обратный вызов во время Page_Init, обновит ваше значение, сохраненное в viewstate (т. Е. Сохраненный текст исчез).

+0

Я думаю, что вы работаете тяжелее, чем вам нужно. Если вы используете элементы управления в среде ASP.NET WebForms, многие, включая TextBox, имеют автоматическое управление представлением в представлении, если вы правильно управляете жизненным циклом страницы. Добавьте TextBox в форму в событии Page_Init, тогда его состояние будет автоматически восстановлено до возникновения события Page_Load (при условии, что он имеет одинаковый идентификатор каждый раз), поэтому текст, введенный пользователем, будет сохранен. – user2638401

ответ

1

Как я уже упоминал в своем комментарии, вы не позволяете системе WebForms работать на вас. Ниже приведен пример формы с динамически создаваемыми элементами управления, поддерживающими viewstate. По вашему описанию панель выходит за рамки формы.

Когда страница отображается, вы можете ввести новый текст и повторно нажимать кнопку «Отправить». Значение TextBox будет автоматически сохранено.

default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    </form> 
    <asp:Panel ID="Panel1" runat="server"></asp:Panel> 
</body> 
</html> 

Default.aspx.cs

using System; 
using System.Web.UI.WebControls; 

public partial class _Default : System.Web.UI.Page 
{ 
    private Label store_Incident_Number = new Label(); 
    private TextBox Incident_Number = new TextBox() { ID = "TextBox1" }; 
    private Button SubmitButton = new Button() { ID = "Button1", Text = "Submit" }; 


    protected void Page_Init(object sender, EventArgs e) 
    { 
     // what is created during this event has viewstate restored to it 
     Panel1.Controls.Add(store_Incident_Number); 
     form1.Controls.Add(Incident_Number); 
     form1.Controls.Add(SubmitButton); 
    } 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     // the viewstate has already been restored so you can access the content of the TextBox 
     store_Incident_Number.Text = Incident_Number.Text; 
    } 
} 
+0

Вот мой вопрос. Динамический контроль должен присутствовать на страницу после обратной передачи, чтобы viewstate сохранял/загружал ее значение? если это правильно, у меня на самом деле есть новый вопрос, но я предпочел бы снова написать, чтобы избежать текстовой стены. Речь идет о выпадающем списке (который управляет загрузкой diff) и кнопке отправки, оба запускают обратную передачу. – Alex

+0

У меня заканчивается время, я отправлю его первым делом завтра утром, спасибо user2638401 – Alex

+0

Да.По завершении события Page_Init все элементы управления на странице (будь то статические в файле ASPX или динамически добавленные во время Page_Init), которые имеют viewstate, восстанавливаются (или обновляются, если пользователь что-то изменил с последним сообщением). Таким образом, вы создаете _structure_ страницы во время Page_Init и обрабатываете _content_ элементов управления во время Page_Load. – user2638401

2

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

Что вы в основном делаете здесь, это загрузить значение метки перед добавлением его в viewstate.

Кроме того, это помогло бы, если бы вы могли рассказать нам, как именно вы делаете обратную передачу. Например, события кликов также являются частью жизненного цикла страницы, и это может изменить некоторые вещи.

+0

Спасибо. Я думал, что знаю жизненный цикл страницы, видимо, я не знаю. Как это сделать? Также я обновляю сообщение, чтобы указать, как выполняется обратная передача. – Alex

+0

Также я пытался следовать этому примеру: https://msdn.microsoft.com/en-us/library/ms227551(v=vs.85).aspx – Alex

Смежные вопросы