0

我有这个 C# ASP.NET 4 网站。

我想在一个类中有一个通用方法,其中包含一个 Response.Redirect 或 Server.Transfer 到特定页面。

上下文中不存在 Response 和 Server 这两个名称。

如何解决这个问题?


至于@Maess 的评论,请考虑这样的事情(已编辑):

ASPX:

<asp:Button onclick="MyClass.btnRedirect_Click" ID="btnMyButton" Text="MyButtonText" runat="server" />

后面的代码:

public static void btnRedirect_Click(object sender, EventArgs e)
{
    Response.Redirect("~/SomePage.aspx");
}
4

3 回答 3

1

You'll find these as properties within HttpContext.Current

于 2012-07-13T14:52:22.987 回答
0

如果要在 HTTP/IIS 堆栈之外被调用,请不要直接引用任何涉及 HTTP/IIS 堆栈的内容。

您最好的选择可能是让您的类或方法接受委托或实现调用代码提供的接口的对象。当您准备好重定向时,使用 URI(或构建它的足够信息)调用该委托/接口方法,然后调用代码可以使用 server.transfer、response.redirect 或通过的单元测试进行响应。

public static void ButtonRedirect()
{
    MyClass foo = new MyClass(delegate(string s) { Server.Transfer(s); });
    foo.DoThings();
}

public class MyClass
{
    private Action<string> redirector;

    public MyClass(Action<string> redirectAction)
    {
        redirector = redirectAction;
    }

    public void DoThings()
    {
        //Doing stuff
        //Aha! this should redirect
        redirector("/go/to/here");
    }
}
于 2012-07-13T15:10:49.577 回答
0

你可以使用System.Web.HttpContext.Current,但要小心。如果在调用这些方法时没有 HTTP 上下文,您将收到异常。

让这些类在构造函数中需要 HttpContext 或者在方法签名中拥有需要 HttpContext 的方法可能更安全。

例如,也许您有一个需要重定向的类,如您所提到的。您的方法签名可能如下所示:public void CustomRedirect(HttpContext context)然后在您的签名正文中,您将执行以下操作context.Response.Redirect("..."):基本上,您使类或方法依赖于具有 HttpContext。

于 2012-07-13T14:56:33.270 回答