2016-10-30 6 views
6

テーマにはいくつかの種類のブレッドクラムがあります。コントローラーは常にカテゴリーです。私は、レイアウトビュー、そのヌルでViewBag.BreadcrumbCategoryにアクセスするとASP.NET MVCコアコントローラのコンストラクタのViewBagプロパティを設定します。

class MyController:Controller{ 
    public MyController() { 
     ViewBag.BreadcrumbCategory = "MyCategory"; 
    } 
} 

:自分自身を繰り返しを避けるために、私はこのようなすべてのアクションのためのコントローラのコンストラクタでそれを設定したいです。アクションでそれは動作します:

class MyController:Controller{ 
    public IActionResult DoSomething() { 
     ViewBag.BreadcrumbCategory = "MyCategory"; 
    } 
} 

私は、ViewBagプロパティの設定はコンストラクタでは不可能だと思っていますか?この作業を行うすべてのアクションに呼び出される関数を持つことは、迷惑で、良い習慣ではありません。 another questionでコンストラクタを使用するのは受け入れられた回答でしたが、これは少なくともASP.NET Coreではうまくいきませんでした。

+3

アクションフィルタを使用する必要があります。 – SLaks

答えて

9

GitHub issueがあります。これは設計によるものです。リンクした答えは、古いレガシーASP.NETスタックであるASP.NET MVC3です。

ASP.NET Coreは、移植性(複数のプラットフォーム)と性能と、Dependency Injectionの組み込みサポートのような最新のプラクティスのために設計された、異なる概念を使用しています。

最後にViewBagをコンストラクタに設定することができません。Constructor基本クラスの特定のプロパティは、派生コントローラでこれらの依存関係を渡す必要がないことに気づいた可能性があるため、プロパティ注入によって注入する必要があります。 。

これは、Controllerのコンストラクタが呼び出されると、HttpContextControllerContextなどのプロパティが設定されていないことを意味します。の後にのみが設定され、コンストラクタが呼び出され、このオブジェクトに対する有効なインスタンス/参照が存在します。

GitHubの問題を指摘しているように、これは設計上の理由で修正されません。

hereが表示されているように、ViewBagはコントローラが初期化された後にViewDataViewDataに依存します。 ViewBag.Something = "something"を呼び出すと、DynamicViewDataクラスの新しいインスタンスが作成されます。このインスタンスは、コンストラクタが初期化された後に置き換えられます。

@SLaksが指摘しているように、コントローラごとに設定するアクションフィルタを使用できます。

次の例では、常にがコントローラをControllerベースクラスから派生していることを前提としています。

public class BreadCrumbAttribute : IActionFilter 
{ 
    private readonly string _name; 

    public BreadCrumbAttribute(string name) 
    { 
     _name = name; 
    } 

    public void OnActionExecuting(ActionExecutingContext context) 
    { 
     await base.OnActionExecuting(context); 

     var controller = context.Controller as Controller; 
     if (controller != null) 
     { 
      controller.ViewBag.BreadcrumbCategory = _name; 
     } 
    } 
} 

今、あなたはそれをあなたのコントローラーを飾ることができるはずです。

[BreadCrumb("MyCategory")] 
class MyController:Controller 
{ 
} 
関連する問題