В C # asp.net можно отправить обратно действительную веб-страницу на полпути через метод? - PullRequest
2 голосов
/ 15 июля 2010

Когда я хочу перенаправить пользователя, который потерял состояние сеанса, обратно в 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 понимает, что я переписал весь раздел «остальная часть обработки». Это проблематично, так как когда я сливаюсь из ветви в транк, он не проверяет, не перезаписываю ли я моды, потому что он предполагает, что поступает весь новый код.

Ответы [ 2 ]

1 голос
/ 14 января 2011

Недавно я снова подумал об этом и понял очень очевидный ответ. Забудьте хорошо структурированный код, поскольку он является частью ловушки ошибок, это особый случай, и используйте return; после вызова метода ForceBackToStartPage:

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();  
       return; 
   }  

...rest of processing

}
1 голос
/ 15 июля 2010

Response.Redirect выдает команду «302 Moved», которая не может обслуживаться асинхронно.Учитывая, что вы просто регистрируете скрипт, когда IsCallback = true, не могли бы вы также сделать это, когда IsCallback = false?Зарегистрируйте сценарий, который подключает событие к загруженному событию окна, и перенаправьте страницу из сценария, а не с сервера.

...