在Response.Redirect之后绕过ASP.NET母版页呈现(url,false)

时间:2016-06-03 20:06:28

标签: c# asp.net

我正在尝试使用我的母版页的代码隐藏来在重定向后向用户显示消息。具体地,

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的{​​{1}}事件,然后我得到了主人的Page_Load事件。但是,我在许多地方(如here)读到这种重定向方式是不可取的。所以,我改为推荐的方式:

Page_Load

,不幸的是现在我的母版页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开始加载之前被称为。我从this响应中看到,没有好办法停止处理页面(除了使用MVC,这对我来说不是一个选项) - 是否有办法至少阻止主页控制加载?

1 个答案:

答案 0 :(得分: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。就像我说的那样,不是非常优雅......还在寻找更好的东西。

<强> 修改

我想出了一个更好的方法。我没有使用母版页的代码隐藏,而是实现了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();

拥有基类还允许我将其他常用功能放在一个类中。欢迎评论。