すべてのコントローラーから継承されるSuperController
を用意しました。コンストラクタで、ViewData sing ControllerNameとActionNameを設定しようとしています。
ControllerNameとActionNameをViewDataとして渡すことはしません。 ControllerNameとActionNameを必要とするメソッドがあり、メソッドの戻り値をViewDataとして渡す必要があります。
どうやってやるの?
ViewData
は使用しないでください。代わりにこれをSite.Masterで使用してください:
<%= ViewContext.RouteData.Values["Controller"] %>
<%= ViewContext.RouteData.Values["Action"] %>
これを試して:
RouteData.Values.First().Value.ToString()
私があなたの投稿を正しく読んでいて、ビューのコントローラー/アクション名にアクセスしようとしているのではなく、INSTEADがそれらを使って何かを行おうとして、結果をviewdataに入れていると仮定します。
コンテキストがまだ作成されていないため、コンストラクターでそれを行うことはできません。 Initializeメソッドをオーバーライドする必要があります。
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
base.Initialize(requestContext);
//here the routedata is available
ViewData["controller_name"] = (ControllerContext.RouteData.Values["Controller"];
}
(ControllerContext.RouteDataだけを関数に渡して、必要な値を選択させることもできます。)
私はこれらの多くをビューから取得する必要があり、少し異なる角度から攻撃しました-HtmlHelperにいくつかの拡張メソッドを記述して、現在のControllerNameとActionNameを提供しました。 ViewData []バッグに飛び込んだり、適切な場所にアイテムを注入したりする必要がないので、処理が少し簡単です。