2016-06-03 1 views
1

Я пытаюсь использовать код моей главной страницы, чтобы отобразить сообщение пользователю после перенаправления. В частности,Обход главной страницы ASP.NET после Response.Redirect (url, false)

public partial class SiteMaster : System.Web.UI.MasterPage 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (Session["redirect_message"] != null) 
     { 
      // put the message in a hidden field for JavaScript to put in an alert() 
      Session.Remove("redirect_message"); 
     } 
    } 
} 

Любая страница, которая затем хочет, чтобы показать сообщение может это сделать:

Session["redirect_message"] = "I've sent you to OtherPage.aspx"; 
Response.Redirect("~/OtherPage.aspx"); 

Это работает так, как я хочу, чтобы это ... я сначала получить OtherPage.aspx «s Page_Load событие, то Я получаю событие мастера Page_Load. Тем не менее, я читал во многих местах (например, here), что этот способ перенаправления не рекомендуется. Таким образом, я изменил к рекомендованному пути:

Session["redirect_message"] = "I've sent you (nicely this time) to OtherPage.aspx"; 
Response.Redirect("~/OtherPage.aspx", false); // don't use Response.End() 
Context.Application.CompleteRequest(); 

и, к сожалению, теперь мой мастер-страницы Page_Load событие вызывается перед темOtherPage.aspx начинает загрузку. Я вижу из this ответ, что нет способа остановить обработку страницы (кроме использования MVC, что не является для меня вариантом) - существует ли способ, по крайней мере, предотвратить загрузку элементов главной страницы?

ответ

0

Вот один из подходов, но его применимость несколько ограничена и кажется довольно неэлегантной. Если я могу принять решение переориентировать в Page_PreInit случае, я могу заменить главную страницу с другим мастером-страницей, которая не обрабатывает Session["redirect_message"] переменные:

public partial class FirstPage : Page { 
    private bool redirected = false; 

    protected void Page_PreInit(object sender, EventArgs e) { 
     if (redirect_condition_is_true) { 
      Session["redirect_message"] = "I've sent you (nicely this time) to OtherPage.aspx"; 
      MasterPageFile = "~/Redirect.master"; 
      Response.Redirect("~/OtherPage.aspx", false); // don't use Response.End() 
      Context.Application.CompleteRequest(); 

     } 
    } 

    protected void Page_Load(object sender, EventArgs e) { 
     // for all Page events we're processing, start with: 
     if (redirected) { 
      return; 
     } 
    } 
} 

Вы не можете просто сделать MasterPageFile = null, так как страница-х элементы ищут главную страницу. Вы должны сделать это в PreInit, потому что это последний раз, когда вы можете изменить главную страницу. Альтернативная главная страница должна содержать все элементы ContentPlaceHolder, на которые ссылается страница, инициирующая перенаправление, и она также должна указать ScriptManager, если на странице есть ScriptManagerProxy. Как я уже сказал, не очень элегантно ... все еще искал что-то лучшее.

EDIT

я понял, лучший способ. Вместо того, чтобы использовать код-код главной страницы, я реализовал подкласс Page, который включает в себя поведение, которое я ищу, тогда любая страница, перенаправляющая целевой объект, наследуется от этого подкласса. Итак:

public class BasePage : System.Web.UI.Page { 
    protected virtual void Page_Load(object sender, EventArgs e) { 
     if (Session["redirect_message"] != null) { 
      ClientScript.RegisterStartupScript(GetType(), "redirect_message", 
       String.Format("alert('{0}');", (string)Session["redirect_message"]), 
       true); 
      Session.Remove("redirect_message"); 
     } 
    } 
} 

и

public class OtherPage : BasePage { 
    protected override void Page_Load(object sender, EventArgs e) { 
     base.Page_Load(sender, e); 
     // page-specifc logic here 
    } 
} 

тогда, когда я обращаю, я использую:

Session["redirect_message"] = "I've sent you (nicely this time) to OtherPage.aspx"; 
Response.Redirect("~/OtherPage.aspx", false); // don't use Response.End() 
Context.Application.CompleteRequest(); 

Имея базовый класс также позволяет мой ставить другие общие функциональные возможности в одном классе. Комментарии приветствуются.

Смежные вопросы