私はこれをフォローしています 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であることです。
これに対する解決策はありますか?
コントローラーは、Indexアクションが呼び出されるポイントのかなり前にインスタンス化され、構築の時点でHttpContextは実際には使用できません。コントローラメソッドIndex
でそれを参照することの何が問題になっていますか?
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
であるActionメソッドを配置することですそのため、ApplicationControllerからではないページ(インデックスページ)を呼び出しても、Action Indexメソッドは呼び出されません。
使用することをお勧めします:
System.Web.HttpContext.Current.Request
覚えとけ System.Web.HttpContext.Current
はスレッドスタティックですが、追加のスレッドを使用しない場合、ソリューションは機能します。
この問題の解決策は、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;
}
}
}