2009-08-21 17 views
7

ユーザのアカウントとやりとりする私のアクションについては、 "TheUser"オブジェクトを作成して、そのオブジェクトを "ViewData [" TheUser "]"私のコントローラ上の任意のアクションが呼び出されるとすぐに。コントローラのコンストラクタでUser.Identity.Nameを持つユーザを定義する

ユーザがログインしている場合は、データベースからユーザの情報を取得し、そうでなければ「ユーザ」オブジェクトはnullになります。

コントローラのコンストラクタで "User.Identity.Name"にアクセスしようとしましたが、アクションが呼び出される前に作成されていません。

カスタム認可フィルタがありましたが、「TheUser」オブジェクトを作成してViewDataに格納することはできません。

これは私が達成したいものの簡単な抜粋です:

[Authorize] 
public class HomeController : Controller 
{ 
    User TheUser; 

    public HomeController() 
    { 
     TheUser = User.Identity.IsAuthenticated ? UserRepository.GetUser(User.Identity.Name) : null; 

     ViewData["TheUser"] = TheUser; 
    } 
} 
+0

この答えは、それはすべてのアクションのために使用されているMVC3 http://stackoverflow.com/a/1506311/511438 –

答えて

15

カスタムベースコントローラクラスを作成し、それに "CurrentUser"プロパティを追加しました。

Initializeメソッドでは、ユーザーを取得し、それをViewDataおよびコントローラの「CurrentUser」プロパティに追加するロジックを配置しました。 、constuctorメソッドを使用して、同様の方法で

public class CustomControllerClass : Controller 
{ 
    public User CurrentUser { get; set; } 

    protected override void Initialize(RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 

     if (requestContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      string userName = requestContext.HttpContext.User.Identity.Name; 
      CurrentUser = UserRepository.GetUser(userName); 
     } 

     ViewData["CurrentUser"] = CurrentUser;     
    } 
} 
+0

BaseControllerからコントローラを継承すると、BaseControllerのExecuteメソッドを実行した後、すべてのWeb要求が停止し、Actionメソッドには移動しません。ブラウザに空白のページが表示されます。これを実行するためにさらに必要なことはありますか? – teenup

+0

プネーネ、私の編集を見てください。私の元々の答えはASP.NET MVC 1でした。MVC 2と3でこの種のことを行う受け入れ場所であるので、 'Initialize'メソッドをオーバーライドするように更新しました。 – Omar

+0

ありがとう、本当にありがたいです。あなたの答えは素晴らしく、簡潔でした。 –

1

は、ユーザーは、すべてのコントローラのアクションまたは特定のもののためにインスタンス化する必要がありますか?

ActionFilterAttributeを作成した場合、Controllerコンテキストにアクセスできます。必要に応じて、コントローラのアクションにこれを添付し、その後

public class MyCustomFilter: ActionFilterAttribute 
{ 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     filterContext.Controller.ViewData["TheUser"] = User.Identity.IsAuthenticated ? UserRepository.GetUser(User.Identity.Name) : null; 
     base.OnActionExecuting(filterContext); 
    } 
} 

:それはAuthorizationFiltersのために真のですが、あなたはこのような何かを試みることができるかどうかわかりません。

+0

TheUserのために私を助けました。私が困惑しているのは、[Authorize]はユーザーが認証されていることを保証しますが、私はUser.Identityにアクセスできませんが、ViewDataにアクセスできます。 – Omar

4

私のセットアップ私のベースコントローラ:

は、私は私のコントローラはカスタムベースControllerクラスを継承していたと私はどこでも、コントローラで「CurrentUserに」変数を参照することができました次のmannnerでこのUser情報を読むことができました。注:私はUserオブジェクトではなく、UserIdのみを格納しますが、私のコードのポイントは、contriuctorメソッドで必要な情報を得る方法を示すことです。

public abstract class BaseController : Controller 
{ 
    int _UserId = 0; 

    public int UserId 
    { 
     get { return _UserId; } 
     set { _UserId = value; } 
    } 

    public BaseController() 
    { 
     var userFromAuthCookie = System.Threading.Thread.CurrentPrincipal; 

     if (userFromAuthCookie != null && userFromAuthCookie.Identity.IsAuthenticated) // && !String.IsNullOrEmpty(userFromAuthCookie.Identity.Name)) 
     { 
      busUser userBO = AceFactory.GetUser(); 
      string userNameFromAuthCookie = userFromAuthCookie.Identity.Name; 
      _UserId = userBO.GetUserIdByUsername(userNameFromAuthCookie); 
     } 
    } 
+0

私はUser.Identityを使用してユーザーを返そうとしていた - 'System.Threading.Thread.CurrentPrincipal'が私のために修正しました - ありがとう – wheelibin

3
public abstract class YourController : Controller 
{ 
    public YourController() 
    { 
     var user = System.Threading.Thread.CurrentPrincipal; 

     TheUser = User.Identity.IsAuthenticated ? UserRepository.GetUser(user.Identity.Name) : null; 

     ViewData["TheUser"] = TheUser; 
    } 
} 
関連する問題