2015-10-16 15 views
6

次のエラーが発生します。値をnullにすることはできません。パラメータ名:プリンシパルコントローラのコンストラクタ内でUser.GetUserId()が失敗する

コントローラのコンストラクタ内でID(userId)にアクセスするにはどうすればよいですか?私は、失敗した呼び出しを関数内で折り返すことによってのみ動作させることができます(両方とも下に強調表示されています)。

注射が必要なものはありますか?

答えて

6

@Henkが述べたようにするactionContextが設定されている前に、コントローラのコンストラクタは、実行されますContextRequestUserなどのプロパティにはアクセスできません。要求のコンテキスト内でuserIdを取得する必要があります。

まだIAsyncActionFilterで非同期アクションフィルタをサポートしているMVC6パイプラインの一部であるaction filtersの旧式のアプローチを使用できます。

コントローラにプロパティを設定する必要があるため、これを実装する最も簡単な方法は、コントローラクラスのOnActionExecutingメソッドをオーバーライドすることです。これは、すでにIActionFilterを実装しているControllerから継承しているために機能します。

public override void OnActionExecuting(ActionExecutingContext context) 
{ 
    //Get user id 
    userId = User.GetUserId(); 
} 

編集

あなたがチェックした場合DefaultControllerFactoryあなたはそれが表示されます。

コントローラは
  • を作成している
    1. 最初にするactionContextがあるDefaultControllerPropertyActivatorビア(設定されていますプロパティアクチベータの1つ):

      var controller = _controllerActivator.Create(actionContext, controllerType); 
      foreach (var propertyActivator in _propertyActivators) 
      { 
          propertyActivator.Activate(actionContext, controller); 
      } 
      
    +0

    ありがとう!それはまさに私が探していたものであり、説明に感謝します:) – Toonsylvania

    1

    コントローラがインスタンス化されると、要求情報がまだHttpContextで利用可能であるという保証はありません。要求は全くないかもしれません。コンストラクタでその情報が必要な理由はありますか?


    私はあなたの問題を理解しています。私は通常、このようなシナリオでは何、唯一のコントローラごとに一度照会バッキングフィールドを持つプロパティを作成することです:

    private int? _userId; 
    public int UserId 
    { 
        get 
        { 
         if (!_userId.HasValue) 
         { 
          // query from db. 
          _userId = 42; 
         } 
         return _userId.Value; 
        } 
    } 
    
    +0

    お返事ありがとうございます。はい、私はすべての私のAPIコントローラは、このいわゆる 'BaseController'から継承する。そのユーザーIDを使用して、アプリケーション全体で使用される他の値を公開します。たとえば、userIdはユーザーのcompanyIdを照会するために使用されます。このcompanyIdは、すべてのコントローラーがその値を継承できるように、このコントローラーのメンバーにもなります。各コントローラには、それらの値(userIdとcompanyId)が必要な多くのクエリが存在するためです。ですから、すべてのコントローラでクエリを実行することなく、すべてのコントローラで使用できるようにするための変数がいくつかあります。 – Toonsylvania

    +0

    @トーンシルバニア私はあなたの懸念を理解しています。私は例を追加しました。 –

    関連する問題