2011-10-23 8 views
16

現在のコントローラ名を取得する方法を知っています。Asp.net mvc 3-現在のコントローラのインスタンスを取得する(名前だけではない)

HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString(); 

しかし、現在のコントローラインスタンスを(アクションではなくビューで)いくつかのクラスで取得する方法はありますか?

+1

どこですか?モデルで?ビューで?もちろん、あなたがアクションに参加している場合は、コントローラを参照するためにこれを使うことができますが、そうでない場合もあります:)。 – BigMike

+0

いくつかのクラス(アクションではなく、ビューではありません) – Alexandre

+0

MVCパターンでは、データモデルのメソッドフローやヘルパーになっていない限り、アクションにバインドされているためです。ちょうどヌル参照を避けるために、私はコントローラのクラスメソッドにパラメータを追加してから、フローの開始位置とそれを渡す位置を追跡します。 – BigMike

答えて

22

デフォルトでは、コントローラ内の現在のControllerには、ControllerContext.ControllerまたはViewContext.Contextのビュー内でのみアクセスできます。いくつかのクラスからアクセスするには、ControllerFactoryというカスタムを実装する必要があります。このコントローラはコントローラのインスタンスをどこかに格納し、そこから取得します。例えば、Request.Itemsに:

public class MyControllerFactory : DefaultControllerFactory 
{ 
    public override IController CreateController(RequestContext requestContext, string controllerName) 
    { 
     var controller = base.CreateController(requestContext, controllerName); 
     HttpContext.Current.Items["controllerInstance"] = controller; 
     return controller; 
    } 
} 

は、次に、あなたのApplication_Startに登録:

ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory()); 

そして、あなたは、コントローラのインスタンス後に取得することができます:

public class SomeClass 
{ 
    public SomeClass() 
    { 
     var controller = (IController)HttpContext.Current.Items["controllerInstance"]; 
    } 
} 

しかし、私はいくつかの別の方法を見つけるだろうこの「ハッキー」回避策の代わりにコントローラインスタンスをクラスに渡す必要があります。ビュー、コントローラで

ViewBag.CurrentController = this; 

:私がやっていることは、あなたがこれを行うことができます何でも、しかし確実に/全体Asp.Netページのライフサイクルに有害である場合

+6

HttpContext.Current.Session ["controllerInstance"]をHttpContext.Current.Items ["controllerInstance"]に変更する必要があります。セッションが特定の構成でデータベースに格納される可能性があるからです。 – John

0

誰かが私を修正する必要があります私の場合は

var c = ViewBag.CurrentController; 
var m1 = BaseController.RenderViewToString(c, "~/Views/Test/_Partial.cshtml", null); 

、私はすべてのコントローラは、拡張ベースコントローラを持っていました。そのベースコントローラーではRenderViewToStringという静的メソッドが使用され、コントローラーが必要でした。この時点で空のコントローラの新しいインスタンスをインスタンス化できたと思ったので、Asp.Net MVCの世界に存在する素敵なViewBagコンテナのビューに送っただけです。私が今に入ることができなかった理由のために、私はコントローラの文字列を取得して、それをビューに戻すことができませんでした(これは要件が変更される前に前に行ったことでした)。

私がこのようにした理由は、PHPやJSのような他の言語でも同様の簡単な方法でクラスを転送できます。

関連する問題