Когда я хочу перенаправить пользователя, который потерял состояние сеанса, обратно в StartPage, я нахожу Response.Redirect («~ / StartPage.aspx»), вызывающий ошибку «Перенаправление ответа не может быть вызвано в обратном вызове страницы». Поэтому в ситуации Page.IsCallback я хочу добавить JavaScript для выполнения перенаправления - это работает - см. Код ниже.
protected void ForceBackToStartPage()
{
if (Page.IsCallback)
{
string fullLoginUrl = ConvertRelativeUrlToAbsoluteUrl( "~/StartPage.aspx" );
string script = string.Format("window.location.href = '{0}';", fullLoginUrl);
ClientScriptManager cm = Page.ClientScript;
cm.RegisterClientScriptBlock(GetType(), "redirect", script, true);
//Response.Flush();
//Response.End();
}
else
{
Response.Redirect("~/StartPage.aspx");
}
}
После того, как я добавил javascript в этот раздел, код продолжает нормально обрабатываться, покидая эту функцию и переходя к другим разделам обработки веб-страницы - проблематично, поскольку у пользователя нет данных сеанса. В идеале я бы хотел, чтобы обработка этой веб-страницы завершилась - и чтобы страница возвращалась в допустимом состоянии, чтобы пользователь перенаправлялся.
Возможно ли это?
Я думал, что Response.Flush (); Response.End (); может сработать, но отправленная обратно в браузер веб-страница вызывает ошибки синтаксического анализа XML.
Дополнительная информация: я проверяю пропущенные данные сеанса в нескольких местах (в зависимости от веб-страницы - этот код находится на многих веб-страницах), например, PageLoad и с помощью некоторых методов кнопки отправки.
До нового метода я использовал этот код, например ::1122*
protected void Page_Load(object sender, EventArgs e)
{
if ((string)Session["OK"] != "OK")
{
// the session has timed out - take them back to the start page
Response.Redirect("~/StartPage.aspx");
}
...rest of processing
Теперь он вызывается так:
protected void Page_Load(object sender, EventArgs e)
{
if ((string)Session["OK"] != "OK")
{
// the session has timed out - take them back to the start page
ForceBackToStartPage();
}
...rest of processing
чтобы я мог явно использовать
еще
{
... остальная часть обработки
}
но я надеялся не делать этого, так как SVN Source Control понимает, что я переписал весь раздел «остальная часть обработки». Это проблематично, так как когда я сливаюсь из ветви в транк, он не проверяет, не перезаписываю ли я моды, потому что он предполагает, что поступает весь новый код.