Непоследовательность поведения с AJAX и ViewState в .NET

голоса
2

Я нахожу, что нажатие на кнопку «Обновить» в браузере будет временно завинтить ViewState для элементов управления внутри UpdatePanel.

Вот моя ситуация: Я сделал обычай WebControl, который хранит значения в ViewState. Я поставил этот контроль внутри UpdatePanel. Когда я нажал на кнопку «Обновить» в браузере, он будет временно стереть значения в ViewState. Однако, на следующий постбэка значения, которые были в ViewState, прежде чем я нажимаю «обновить» волшебно снова.

Такое поведение щурит мой WebControl. После того, как я ударил «освежают» управление возвращается в исходное состояние, так как ViewState пуст и IsPostBack устанавливается в ложь. Однако, когда я нажимаю на одном из элементов управления обратной передачи в пределах моей WebControl, то WebControl перезагружается с теми же значениями, которые были в ViewState, прежде чем я ударил «обновление.»

Как ни странно, это происходит только тогда, когда я использую AJAX. Когда мой контроль находится вне из UpdatePanel, Firefox дает мне это стандартное сообщение «Чтобы открыть эту страницу, Firefox должен отправить информацию, которая будет повторять какие-либо действия (например, поиск или подтверждение заказа), которая была выполнена ранее (Отправить повторно) (Отмена) «. Это хорошо, потому что, по крайней мере поведение согласуется. Тем не менее, я абсолютно необходимо использовать AJAX для этого проекта.

Так это то, что я хотел бы сделать, - я хочу, чтобы сделать «обновить» поведение последовательно. Было бы лучше, если нажать «обновить» не влияет на ViewState вообще. Но если он должен уничтожить ViewState, это нормально, до тех пор, как ViewState прибывания уничтожено. Ни один из этих вещей со значениями исчезать и появляться.

Ах да, и вот мой пример кода:

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

namespace TestControls
{
    public class TestControl : WebControl
    {
        int _clickCount;
        bool _mustUpdate;

        protected override void LoadViewState(object savedState)
        {
            base.LoadViewState(savedState);

            _clickCount = ((int)ViewState[clickCount]);
            _mustUpdate = ((bool)ViewState[mustUpdate]);
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            Controls.Clear();
            ControlCreator();
        }

        private void ControlCreator()
        {
            Label tempLabel = new Label();
            LiteralControl tempLiteral = new LiteralControl(<br/><br/>);
            LinkButton tempLink = new LinkButton();

            tempLink.ID = testLink;
            tempLink.Text = Click me!;
            tempLink.Click += new EventHandler(tempLink_Click);

            tempLabel.ID = testLabel;
            tempLabel.Text = _clickCount.ToString();

            Controls.Add(tempLabel);
            Controls.Add(tempLiteral);
            Controls.Add(tempLink);
        }

        void tempLink_Click(object sender, EventArgs e)
        {
            _clickCount++;
            _mustUpdate = true;
        }

        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);

            if (_mustUpdate)
            {
                Controls.Clear();
                ControlCreator();

                _mustUpdate = false;
            }
        }

        protected override object SaveViewState()
        {
            ViewState[clickCount] = _clickCount;
            ViewState[mustUpdate] = _mustUpdate;

            return base.SaveViewState();
        }
    }
}
Задан 09/12/2008 в 21:50
источник пользователем
На других языках...                            


3 ответов

голоса
1

Я просто перечитайте свой вопрос и понял, что я что-то пропустил ...

Вы ударяете браузеры кнопки обновления!

Является ли это проблемой? ДА!

Что происходит, когда вы нажмете на кнопку обновления в браузере? Он обновляет текущую страницу. Если был постбэк, он будет повторно почтовые данные.

Обратный вызов AJAX может обновлять ViewState, насколько страница обеспокоена, но после нажатия кнопки обновления браузера будет повторно опубликовать старый ViewState.

Существует множество является обсуждение по этому вопросу, которые вы можете Google.

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

Наконечник для вытирания истории обратной передачи (для предотвращения повторного поста) является перенаправление обратно на ту же страницу еще раз.

Ответил 12/12/2008 в 14:19
источник пользователем

голоса
1

Попробуйте следующее ...

    protected override void LoadViewState(object savedState)
    {
        if (savedState != null)
        {
            object[] myState = (object[])savedState;

            if (myState[0] != null) base.LoadViewState(myState[0]);
            if (myState[1] != null) _clickCount = ((int)myState[1]);
            if (myState[2] != null) _mustUpdate = ((bool)myState[2]);
        }
    }

    protected override object SaveViewState()
    {
        object[] allStates = new object[3];

        allStates[0] = base.SaveViewState();
        allStates[1] = _clickCount;
        allStates[2] = _mustUpdate;

        return allStates;
    }

В основном , полученные выше код из Control.LoadViewState метода и Control.SaveViewState метода из MSDN.

Ответил 10/12/2008 в 00:27
источник пользователем

голоса
0

Ваш ViewState не сохраняется. SaveViewState переопределения для сохранения объектов, а не для сдачи вещи в ViewState мешок. Мешок ViewState уже за точкой mnarking вещи грязные и изменения не будут сохранены. Вам нужно создать массив объектов для загрузки / просмотра ViewState информации.

Делайте то, что показывает BlackMael.

Ответил 10/12/2008 в 00:32
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more