Почему мои данные теряются после обратной передачи - PullRequest
1 голос
/ 03 апреля 2011

У меня есть простая форма:

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <asp:Button ID="Button1"
            runat="server" Text="Button" onclick="Button1_Click" />
    </div>
    </form>
</body>
</html>

И код позади:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1
{
    public partial class _Default : System.Web.UI.Page
    {
        string myVariable;
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                myVariable = "abc";
            }
        }

        protected void Button1_Click(object sender, EventArgs e)
        {

        }
    }
}

В FormLoad myVariable присваивается "abc".

В форме введите что-то в текстовое поле и отправьте форму. Значение myVariable превращается в «ноль»

Почему мои данные на myVariable теряются? (

Я использую: VS2008 SP1 Пожалуйста, помогите!

Ответы [ 5 ]

5 голосов
/ 03 апреля 2011

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

Цитируется из ASP .NET StateУправление .Я настоятельно рекомендую вам ознакомиться с функциями управления состоянием ASP .NET.

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

1 голос
/ 03 апреля 2011

Так оно и есть (HTTP без сохранения состояния).Вам нужно будет сделать

    string myVariable;
    protected void Page_Load(object sender, EventArgs e)
    {
           myVariable = "abc";
    }

там, где вы каждый раз инициализируете переменную.

или сохранить ее в коллекции сеансов.

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            Session["myVariable"] = "abc";
        }
    }

и использовать Session["myVariable"] as String

1 голос
/ 03 апреля 2011

Экземпляры объектов не сохраняются при загрузке страниц. Думайте о каждом запросе к серверу как о совершенно новой реализации классов страниц. Чтобы сохранить данные в нескольких запросах страницы, вам нужно хранить их вне области класса страницы. У вас есть несколько вариантов:

  • Хранить в состоянии сеанса
  • Хранить в состоянии приложения
  • Хранить в базе данных
  • Сохранить в файле
  • и т.д.

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

1 голос
/ 03 апреля 2011

когда вы объявляете: string myVariable;

вы объявляете это в области видимости класса Page.Однако подумайте о процессе здесь.

1) Вы объявляете его без значения в начале класса Page.2) Вы регистрируетесь в Page_Load, чтобы увидеть, является ли это обратной передачей.Если нет, присвойте ему значение abc.

Теперь, когда вы отправляете форму, она является обратной передачей.Поэтому блок присваивания в Page_Load не запускается!Таким образом, оно остается тем же значением, которое было при первой загрузке страницы ... которое равно NULL.

Имеет смысл?

Попробуйте что-то вроде этого:

protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                myVariable = "abc";
            }
else
{
// hey im a postback, i need a value though!
myVariable = "xyz";
}
        }

IMO Я не думаю, что управление состоянием является природой вопроса в отличие от переменной области.Если ОП не понимает сферу действия, то состояние является проблемой с тележкой / лошадью.

0 голосов
/ 04 апреля 2011

Лучшее место для хранения строковой переменной из нескольких символов - это View State .

...