web-dev-qa-db-ja.com

コントローラーのコンストラクターでHttpContext.Requestにアクセスする

私はこれをフォローしています MicrosoftのASP.NET MVCチュートリアル

私のコードはわずかに異なり、アクセスしようとしていますHttpContext.Request.IsAuthenticatedコントローラーのコンストラクター。

namespace SCE.Controllers.Application
{
    public abstract class ApplicationController : Controller
    {
        public ApplicationController()
        {
            bool usuario = HttpContext.Request.IsAuthenticated;
        }           
    }
}

問題は、HttpContextが常にnullであることです。

これに対する解決策はありますか?

51
ozsenegal

コントローラーは、Indexアクションが呼び出されるポイントのかなり前にインスタンス化され、構築の時点でHttpContextは実際には使用できません。コントローラメソッドIndexでそれを参照することの何が問題になっていますか?

9
spender

HttpContext.Request.IsAuthenticatedをコントローラーレベルに配置する代わりに、OnActionExecuting()メソッドのオーバーライドメソッドですべてのコントローラーに継承されるコントローラーベースクラスに配置する必要があります。

あなたのコントローラーベースには

public class BaseController : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext ctx) {
        base.OnActionExecuting(ctx);
        ViewData["IsAuthenticated"] = HttpContext.Request.IsAuthenticated;
    }
}

すべてのコントローラーはBaseControllerクラスを継承する必要があります

public class ApplicationController : BaseController

マスターページでViewData["IsAuthenticated"]を取得する必要があります。

編集

あなたが与えたリンクで、あなたがしたことに関連して、あなたのApplicationControllerはベースコントローラーではなくページコントローラーです。この例では、ApplicationControllerHomeControllerによって継承されるベースコントローラーですが、あなたがしたことは、ベースコントローラー内にApplicationControllerであるActionメソッドを配置することですそのため、ApplicationControllerからではないページ(インデックスページ)を呼び出しても、Action Indexメソッドは呼び出されません。

103
rob waminal

使用することをお勧めします:

 System.Web.HttpContext.Current.Request

覚えとけ System.Web.HttpContext.Currentはスレッドスタティックですが、追加のスレッドを使用しない場合、ソリューションは機能します。

49
Ghini Antonio

この問題の解決策は、RequestContextオブジェクトを渡すことでInitializeのオーバーライドメソッドを作成することです。

public class ChartsController : Controller
{
     bool isAuthed = false;
    protected override void Initialize(System.Web.Routing.RequestContext requestContext)
    {
        base.Initialize(requestContext);

        if (requestContext.HttpContext.User.Identity.IsAuthenticated)
        {
          isAuthed =true;
        }
    }
}
8