62

私はMicrosoftからのこのASP.NETMVCチュートリアルに従っています:

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

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

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

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

4

5 に答える 5

113

コントローラレベルに配置する代わりに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はページコントローラーであり、ベースコントローラーではありません。例でApplicationControllerは、は継承されたベースコントローラーですがHomeController、実行したのは、アクションメソッドをベースコントローラー内に配置しているApplicationControllerため、どのページ(インデックスページ)を呼び出してもアクションインデックスメソッドが呼び出されないようにすることです。これはApplicationControllerからのものではありません。

于 2010-08-08T01:21:53.840 に答える
59

私はあなたが使用することをお勧めします:

 System.Web.HttpContext.Current.Request

スレッドスタティックであることを覚えておいSystem.Web.HttpContext.Currentてください。ただし、追加のスレッドを使用しない場合、ソリューションは機能します。

于 2013-07-09T10:15:25.903 に答える
12

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

于 2010-08-08T01:22:16.340 に答える
11

この問題の解決策は、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;
        }
    }
}
于 2016-02-29T17:56:35.403 に答える
2

ここに画像の説明を入力してください私がここに投稿している回答では、IsAuthenticatedにアクセスすることはできませんが、HttpContextRequestに関連するいくつかのものにアクセスすることはできます(画像を参照)。

コンストラクターにセッション値が必要でした。

IHttpContextAccessorは次のように使用できます。

public ABCController(IHttpContextAccessor httpContextAccessor)   
{
     //do you stuff with httpContextAccessor,  

     // This gives session value
     string abc = httpContextAccessor.HttpContext.Session.GetString("Abc");
}

また、startup.csでは、次の設定を行う必要があります。

services.AddHttpContextAccessor();
于 2021-10-15T11:12:54.210 に答える