2

场景

我有一个 ASP.NET 项目,它使用自定义授权/身份验证方法(与使用表单/Windows 身份验证等相比)。在每次安全页面加载时,都会执行以下代码:

protected void Page_Load(Object sender, EventArgs e)
{
    if (!IsLoggedIn)
    {
        HttpContext.Current.Response.Redirect("~/Login/", true);
    }
}

这段代码主要检查用户是否仍然登录(没有过期的 ASP.NET 会话,没有注销等);如果用户未登录,则将其Response.Redirect()发送到登录页面。

当用户请求一个完整的页面(通过链接或直接 URL)时,此方案工作得非常好。使用异步回发时会出现问题!

我有一个嵌套在 中的按钮<asp:UpdatePanel>,单击时会导致异步回发。此按钮更新<asp:Label />. 例如:

<!-- the button -->
<asp:LinkButton ID="MyButton" CausesValidation="false" Text="My Button" OnClick="MyButton_Click" runat="server" />

<!-- the label -->
<asp:Label ID="MyLabel" runat="server" />
protected void MyButton_Click(Object sender, EventArgs e)
{
    MyLabel.Text = DateTime.Now.ToString();
}

问题

当异步回发正在执行并且IsLoggedIn为 false 时,请求将被重定向到登录页面。现在,ASP.NET 框架需要一个特定的响应(而不是 HTML 页面);因此,抛出以下错误:

在此处输入图像描述

问题

我该如何解决这个问题?如何在异步回发期间强制整个页面从代码隐藏重定向到特定地址?

4

3 回答 3

4

虽然Kenneth 的回答是适当的重定向方法,但我需要一些更自定义的东西。

在异步回发期间,我需要模拟Response.Redirect("path", true)-true参数(指示当前页面的执行是否应该终止)是我需要复制的重要内容!简单地使用Response.End()afterScriptManager.RegisterClientScriptBlock()是行不通的,因为这样就不会有任何响应发送回浏览器。

通过分析服务器对异步回发的响应,我使用了以下技巧(使用 模拟响应Response.Write):

String jsRedirect = String.Format("window.location.pathname = '{0}';", VirtualPathUtility.ToAbsolute(url));

Response.Write(
    // required parameters!
    "0|asyncPostBackControlIDs|||" +
    "0|postBackControlIDs|||" +
    "0|updatePanelIDs|||" +
    "0|childUpdatePanelIDs|||" +
    "0|panelsToRefreshIDs|||" +

    // your custom JavaScript
    String.Format("{0}|scriptBlock|ScriptContentNoTags|{1}|", jsRedirect.Length, jsRedirect)
);
Response.Flush();
Response.End();
于 2013-04-03T17:53:05.083 回答
3

如果您想从代码隐藏触发,您可以这样做:

if (ScriptManager.GetCurrent(Page).IsInAsyncPostBack) {
    ScriptManager.RegisterStartupScript(updatepanelid, typeof(string), "redirect", "window.location = 'http://www.google.com';", true);
} else {
    Response.Redirect("http://www.google.com");
}

另请注意,如果您使用window.open(),将打开一个弹出窗口(可能会或可能不会被阻止)。如果你使用window.location = "someurl";它只会做一个客户端重定向。

于 2013-04-02T22:25:30.550 回答
0

这里有一些术语误解。“异步回发”在技术上根本不是回发;它是一个xmlHttpRequest. 如果您想在此处进行重定向,则必须使用 ajax 回调函数在 javascript 中完成window.open()

我不确定你将如何使用 asp.net AJAX 来实现它。在服务器上执行 xmlHttpRequest 代码期间,不可能重定向客户端(澄清 - 您可以重定向,但您响应的 html 将(如您的情况)被 asp.NET 的 javascript ajax 代码错误地解析。

使用 jQuery,这将是一个伪解决方案。

$.ajax({
    success: function(data) {
        if (data == 'redirect') {
            window.open('yourRedirectUrl');
        }
    }
});
于 2013-04-02T20:28:09.190 回答