現在のコントローラ名を取得する方法を知っています。Asp.net mvc 3-現在のコントローラのインスタンスを取得する(名前だけではない)
HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();
しかし、現在のコントローラインスタンスを(アクションではなくビューで)いくつかのクラスで取得する方法はありますか?
現在のコントローラ名を取得する方法を知っています。Asp.net mvc 3-現在のコントローラのインスタンスを取得する(名前だけではない)
HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString();
しかし、現在のコントローラインスタンスを(アクションではなくビューで)いくつかのクラスで取得する方法はありますか?
デフォルトでは、コントローラ内の現在の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ページのライフサイクルに有害である場合
HttpContext.Current.Session ["controllerInstance"]をHttpContext.Current.Items ["controllerInstance"]に変更する必要があります。セッションが特定の構成でデータベースに格納される可能性があるからです。 – John
誰かが私を修正する必要があります私の場合は
var c = ViewBag.CurrentController;
var m1 = BaseController.RenderViewToString(c, "~/Views/Test/_Partial.cshtml", null);
、私はすべてのコントローラは、拡張ベースコントローラを持っていました。そのベースコントローラーではRenderViewToStringという静的メソッドが使用され、コントローラーが必要でした。この時点で空のコントローラの新しいインスタンスをインスタンス化できたと思ったので、Asp.Net MVCの世界に存在する素敵なViewBagコンテナのビューに送っただけです。私が今に入ることができなかった理由のために、私はコントローラの文字列を取得して、それをビューに戻すことができませんでした(これは要件が変更される前に前に行ったことでした)。
私がこのようにした理由は、PHPやJSのような他の言語でも同様の簡単な方法でクラスを転送できます。
どこですか?モデルで?ビューで?もちろん、あなたがアクションに参加している場合は、コントローラを参照するためにこれを使うことができますが、そうでない場合もあります:)。 – BigMike
いくつかのクラス(アクションではなく、ビューではありません) – Alexandre
MVCパターンでは、データモデルのメソッドフローやヘルパーになっていない限り、アクションにバインドされているためです。ちょうどヌル参照を避けるために、私はコントローラのクラスメソッドにパラメータを追加してから、フローの開始位置とそれを渡す位置を追跡します。 – BigMike