0

この C# ASP.NET 4 Web サイトがあります。

特定のページへの 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

これらはプロパティとして見つかりますHttpContext.Current

于 2012-07-13T14:52:22.987 に答える
0

使えますSystem.Web.HttpContext.Currentが注意が必要です。これらのメソッドが呼び出された時点で HTTP コンテキストがない場合、例外が発生します。

これらのクラスでは、コンストラクターで HttpContext を必要とするか、HttpContext を必要とするメソッドをメソッド シグネチャに含める方がおそらく安全です。

たとえば、あなたが言及したようにリダイレクトする必要があるクラスがあるかもしれません。メソッド シグネチャは次のようpublic void CustomRedirect(HttpContext context)になります。次に、シグネチャの本体内で次のようにしますcontext.Response.Redirect("...")。基本的に、HttpContext を持つことに依存するクラスまたはメソッドを作成します。

于 2012-07-13T14:56:33.270 に答える
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 に答える