2012-06-15 3 views
0

Предположим, у нас есть две страницы: pageX.aspx и страницаY.aspx. На этих страницах используется главная страница в верхней части браузера, где у пользователя есть несколько вариантов изменения языка сайта. Эти языковые варианты представлены в виде кнопок изображения (флаги страны), но они не используют свойство PostbackUrl. Вместо этого они просто используют обработчики событий. Один такой обработчик изображений:PostbackUrl относительно основных страниц

protected void imgbtnEnglish_Click(object sender, ImageClickEventArgs e) 
{ 
    HttpCookie aCookie = new HttpCookie("language"); 
    aCookie.Value = "en-US"; 
    aCookie.Expires = DateTime.Now.AddDays(365); 
    Response.Cookies.Add(aCookie); 

    Response.Redirect(Request.RawUrl); 
} 

pageX.aspx содержит изображение кнопки, которая имеет свойство PostbackUrl="pageY.aspx". Единственная цель этой кнопки изображения - просто взять нас на pageY.aspx.

При нажатии этой кнопки, как и ожидалось, мы принимаем pageY.aspx.

Теперь вот для меня загадка: когда я нажимаю НАЗАД в браузере (не управления или что-нибудь, просто старая добрая кнопка назад), я возвращаюсь к pageX.aspx, который отлично ... кроме, казалось бы, главная страница наверху думает, что я все еще на страницеY.aspx! Потому что, хотя я сейчас вернулся на pageX.aspx на моем экране, щелкнув любой из флагов наверху, верните меня на pageY.aspx!

Единственное, что я могу логически вывести, это то, что по какой-то причине, поскольку это PostbackUrl, и он отправляет форму на сервер, «возврат» распознается локально только для отправленной формы, а не для всего (включая главную страницу). Поэтому, перейдя «назад», я нахожусь только «назад» только в форме, а не в форме И главной странице.

Что я сделал, чтобы решить мою проблему, чтобы сделать изображение кнопки, которая принимает меня pageY.aspx не использовать PostBackUrl, но вместо этого нажмите обработчик события с одной строкой: Response.Redirect ("Пейджи. ASPX "); Когда я это делаю, он работает нормально.

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

+1

Вы используете браузер Opera? –

+0

Hah, действительно, я! .. Я предполагаю, что вы спросили, что это может быть специфическая для браузера? – CptSupermrkt

+0

Да, это зависит от браузера. Полная информация о том, почему я думал, что Opera находится в моем ответе ниже –

ответ

1

Когда кнопка нажата назад браузеры восстановить страницу из кеша вместе с последними данными формы, например текстовые поля сохраняют введенные значения. Однако Opera пытается стать более умным и восстанавливает последнее состояние JavaScript.

Установка PostBackUrl означает, что при нажатии кнопки действие формы изменяется с использованием JavaScript и формы, размещенной на этом новом URL-адресе.Таким образом, когда вы нажимаете обратно в Opera, он восстанавливает страницу вместе с изменением JavaScript на действие формы, а это означает, что все последующие отправления перейдут на этот новый URL.

Я не поклонник использования PostBackUrl, потому что он работает только с включенным JavaScript. Использование Response.Redirect на стороне сервера и на стороне клиента Hyperlinks - лучшее решение.

0

PostbackUrl vs NavigateUrl

В основном с NavigateURL, вы делаете POST. Response.Redirect сделает GET. Я не совсем уверен, почему вы видите это конкретное поведение, но вполне может быть вашим браузером. Какой браузер вы используете? Какие другие браузеры вы пробовали?

Что касается того, что было бы лучшим способом сделать это, я думаю, вам лучше забыть элементы управления ASP.NET и как это сделать:

<a href="pageY.aspx"><img src="foo.png" /></a> 
Смежные вопросы