Как обнаружить обновление страницы в .net
У меня есть событие Button_click
. Во время обновления страницы предыдущее событие Postback
запускается снова. Как определить событие обновления страницы, чтобы предотвратить действие Postback
?
Я попробовал приведенный ниже код, чтобы решить эту проблему. Фактически, я добавляю визуальный веб-сайт на странице SharePoint. Добавление webpart - это событие обратной записи, поэтому postback всегда является false каждый раз, когда я добавляю веб-страницу на страницу, и я получаю ошибку в цикле else, потому что ссылка на объект null
.
if (!IsPostBack){
ViewState["postids"] = System.Guid.NewGuid().ToString();
Cache["postid"] = ViewState["postids"].ToString();
}
else{
if (ViewState["postids"].ToString() != Cache["postid"].ToString()){
IsPageRefresh = true;
}
Cache["postid"] = System.Guid.NewGuid().ToString();
ViewState["postids"] = Cache["postid"].ToString();
}
Как решить эту проблему?
Ответы
Ответ 1
Использование viewstate работало намного лучше для меня, как подробный здесь. В основном:
bool IsPageRefresh = false;
//this section of code checks if the page postback is due to genuine submit by user or by pressing "refresh"
if (!IsPostBack)
{
ViewState["ViewStateId"] = System.Guid.NewGuid().ToString();
Session["SessionId"] = ViewState["ViewStateId"].ToString();
}
else
{
if (ViewState["ViewStateId"].ToString() != Session["SessionId"].ToString())
{
IsPageRefresh = true;
}
Session["SessionId"] = System.Guid.NewGuid().ToString();
ViewState["ViewStateId"] = Session["SessionId"].ToString();
}
Ответ 2
Эта статья может вам помочь
http://www.codeproject.com/Articles/68371/Detecting-Refresh-or-Postback-in-ASP-NET
вы добавляете Guid в свое состояние просмотра, чтобы однозначно идентифицировать каждую страницу. Этот механизм отлично работает, когда вы находитесь в самом классе Page. Если вам нужно определить запросы до того, как вы достигнете обработчика страниц, вам нужно использовать другой механизм (поскольку состояние представления еще не восстановлено).
Событие Page.LoadComplete - это разумное место, чтобы проверить, связано ли руководство со страницей, а если нет, создайте его.
проверить это
http://shawpnendu.blogspot.in/2009/12/how-to-detect-page-refresh-using-aspnet.html
Ответ 3
Если вы хотите обнаружить обновление HTTP GET, а не только POST, вот хакерская работа, которая в современных браузерах работает в основном.
JavaScript:
window.onload = function () {
// regex for finding "loaded" query string parameter
var qsRegex = /^(\?|.+&)loaded=\d/ig;
if (!qsRegex.test(location.search)) {
var loc = window.location.href + (window.location.search.length ? '&' : '?') + 'loaded=1';
window.history.replaceState(null, document.title, loc);
}
};
С#:
public bool IsPageRefresh
{
get
{
return !string.IsNullOrEmpty(Request.QueryString["loaded"]);
}
}
Когда страница загружается, она изменит добавление параметра QueryString loaded=1
без перезагрузки страницы (опять же, это - window.history.replaceState
- работает только в пост-архаичные браузеры). Затем, когда пользователь обновляет страницу, сервер может проверить наличие параметра loaded
строки запроса.
Предостережение: в основном работает
Случай, когда это не работает, - это когда пользователь нажимает адресную строку и нажимает enter. То есть, сервер будет генерировать ложноположительный, обнаруживая обновление, когда есть вероятность, пользователь на самом деле хотел перезагрузить страницу свежей.
В зависимости от ваших целей, возможно, это желательно, но, как пользователь, это сбило бы меня с ума, если бы я ожидал, что он будет reset на странице.
Я не слишком много думал об этом, но возможно было бы написать какую-то магию, чтобы отличить обновление от reset через адресную строку, используя любой/все:
-
SessionState
(предполагается, что SessionState
включен), а значение параметра loaded
QueryString
- прослушиватель событий
window.onbeforeunload
- события клавиатуры (обнаружение F5 и Ctrl + R, чтобы быстро изменить URL-адрес обратно на удаление параметра
loaded
QueryString), хотя это было бы ложно-отрицательным для нажатия кнопки обновления браузера)
- печенье
Если кто-то придумает решение, я бы хотел его услышать.
Ответ 4
Еще один способ проверить обновление страницы. Я написал собственный код без Java-скрипта или какой-либо клиентской стороны.
Не уверен, что это лучший способ, но я чувствую себя хорошо.
protected void Page_Load(object sender, EventArgs e)
{
if ((Boolean)Session["CheckRefresh"] is true)
{
Session["CheckRefresh"] = null;
Response.Write("Page was refreshed");
}
else
{ }
}
protected void Page_PreInit(object sender, EventArgs e)
{
Session["CheckRefresh"] = Session["CheckRefresh"] is null ? false : true;
}
Ответ 5
Простое решение
Думал, что выложу это простое решение из 3 строк, если оно кому-нибудь поможет. После публикации значения IsPageRefresh сеанса и viewstate будут равны, но они не синхронизируются при обновлении страницы. И это вызывает перенаправление, которое сбрасывает страницу. Вам нужно будет немного изменить перенаправление, если вы хотите сохранить параметры строки запроса.
protected void Page_Load(object sender, EventArgs e)
{
var id = "IsPageRefresh";
if (IsPostBack && (Guid)ViewState[id] != (Guid)Session[id]) Response.Redirect(HttpContext.Current.Request.Url.AbsolutePath);
Session[id] = ViewState[id] = Guid.NewGuid();
// do something
}