Я обнаружил, что нажатие кнопки "Обновить" в моем браузере временно испортит ViewState для элементов управления внутри UpdatePanel.
Вот моя ситуация: я создал собственный WebControl, который хранит значения в ViewState. Я поместил этот элемент управления в UpdatePanel. Когда я нажимаю кнопку «обновить» в моем браузере, он временно стирает значения в ViewState. Однако при следующей обратной передаче значения, которые были в ViewState до того, как я нажал «обновить», волшебным образом появляются снова.
Такое поведение портит мой веб-контроль. После нажатия кнопки «обновить» элемент управления возвращается в исходное состояние, поскольку ViewState пуст и IsPostBack имеет значение false. Однако, когда я нажимаю на один из элементов управления обратной передачей в моем WebControl, WebControl перезагрузится с теми же значениями, которые были в ViewState, прежде чем я нажму «обновить».
Странно, это происходит только тогда, когда я использую AJAX. Когда мой элемент управления находится за пределами UpdatePanel, Firefox выдает мне стандартное сообщение: «Чтобы отобразить эту страницу, Firefox должен отправить информацию, которая будет повторять любое действие (например, поиск или подтверждение заказа), которое было выполнено ранее (Повторная отправка) (Отмена) «. Это хорошо, потому что, по крайней мере, поведение является последовательным. Тем не менее, я обязательно должен использовать AJAX для этого проекта.
Так что это то, что я хотел бы сделать - я хочу, чтобы поведение "обновления" было последовательным Было бы лучше, если бы нажатие кнопки «обновить» вообще не повлияло на ViewState. Но если он должен уничтожить ViewState, это нормально, если ViewState STAYS уничтожен. Ничего из этого с исчезновением и повторным появлением значений.
О да, и вот мой пример кода:
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();
}
}
}