Переменные Ajax TimerControl и Instance? - PullRequest
3 голосов
/ 18 июля 2010

У меня возникла проблема при попытке записи в экземпляр класса моей страницы при использовании элемента управления Ajax timer.

Ниже я построил очень простой пример, который эмулирует точную проблему, которую яУ меня есть ...

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

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

Разметка:

<form id="form1" runat="server">
<div>

    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>

    <asp:Timer ID="Timer1" runat="server" Interval="1000" OnTick="UpdateText">
    </asp:Timer>

    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <asp:Label runat="server" Text="" ID="lblCounter"></asp:Label>
    </ContentTemplate>

    <Triggers>
    <asp:AsyncPostBackTrigger ControlID="Timer1" />
    </Triggers>
    </asp:UpdatePanel>

</div>
</form>

CodeBehind:

public partial class TimerControl : System.Web.UI.Page
{
    private static int loopCounter = 0;


    protected void Page_Load(object sender, EventArgs e)
    {
    }

    public void UpdateText(object sender, EventArgs e)
    {
        lblCounter.Text = loopCounter.ToString();
        loopCounter++;
    }

}

Если вы запустите это, вы обнаружите, что оно работает, прекрасно, но я не хочу, чтобы переменная 'loopCounter' была статической, поскольку это применимо ко всему уровню приложения, и все пользователи будут читать / записывать в одну и ту же переменную..

Когда я пытаюсь удалить ключевое слово static, переменная loopCounter больше не обновляется, она просто остается равной нулю ... В коде или в браузере отсутствуют ошибки (JavaScript).

Я нашел временное решение, используя вместо этого сеансы, которые работают хорошо и остаются в контексте пользователя, но я предпочитаю не использовать сеансы, если мне действительно не нужно.

Может кто-нибудь объяснить, почему нельзя написать «экземпляр» члена, как это?Почему он работает только для статического?

1 Ответ

2 голосов
/ 18 июля 2010

Причина, по которой это происходит, заключается в том, что http - это протокол без сохранения состояния.Конкретная причина вашей проблемы заключается в том, что экземпляры страниц не сохраняются в памяти после завершения запроса.Каждый раз, когда вы делаете запрос на страницу ASP.NET, создается новый экземпляр страницы.Вы можете легко проверить это сами, добавив конструктор по умолчанию к классу вашей страницы и поместив туда точку останова.

Помимо использования состояния сеанса, вы также можете использовать viewstate для этого.В этом случае это, вероятно, будет лучшим решением, поскольку данные, которые вы используете (ваш счетчик), зависят не от пользователя, а от конкретной страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...