回答:
を使用ViewContext
してRouteData
コレクションを確認し、コントローラー要素とアクション要素の両方を抽出します。ただし、コントローラー/アクションではなく、アプリケーションコンテキストを示すデータ変数(「editmode」や「error」など)を設定すると、ビューとコントローラー間の結合が減少すると思います。
RCでは、このようなアクションメソッド名のようなルートデータを抽出することもできます
ViewContext.Controller.ValueProvider["action"].RawValue
ViewContext.Controller.ValueProvider["controller"].RawValue
ViewContext.Controller.ValueProvider["id"].RawValue
ViewContext.Controller.ValueProvider.GetValue("action").RawValue
ViewContext.Controller.ValueProvider.GetValue("controller").RawValue
ViewContext.Controller.ValueProvider.GetValue("id").RawValue
ViewContext.Controller.RouteData.Values["action"]
ViewContext.Controller.RouteData.Values["controller"]
ViewContext.Controller.RouteData.Values["id"]
ViewContext.RouteData.Values["action"]
ViewContext.RouteData.Values["controller"]
ViewContext.RouteData.Values["id"]
ViewContext.Controller.ValueProvider.GetValue("action").RawValue
+バリエーション
ビューの現在のIDを取得するには:
ViewContext.RouteData.Values["id"].ToString()
現在のコントローラーを取得するには:
ViewContext.RouteData.Values["controller"].ToString()
ViewContext.RouteData.Values.ContainsKey(<key>)
最初に確認します。
私はこれが古い質問であることを知っていますが、私はそれを見て、あなたがあなたのビューにそれが仕事をするのに必要なデータを検索することを許可させるよりも別のバージョンに興味があるかもしれないと思いました。
私の意見では、より簡単な方法は、OnActionExecutingメソッドをオーバーライドすることです。必要な情報を取得するために使用できるActionDescriptorメンバーを含むActionExecutingContextが渡されます。これはActionNameであり、ControllerDescriptorに到達することもでき、ControllerNameが含まれています。
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
ActionDescriptor actionDescriptor = filterContext.ActionDescriptor;
string actionName = actionDescriptor.ActionName;
string controllerName = actionDescriptor.ControllerDescriptor.ControllerName;
// Now that you have the values, set them somewhere and pass them down with your ViewModel
// This will keep your view cleaner and the controller will take care of everything that the view needs to do it's job.
}
お役に立てれば。どちらかといえば、少なくともそれはあなたの質問によって来る他の誰かのための代替案を示します。
私はさまざまな答えを見て、クラスヘルパーを思いつきました。
using System;
using System.Web.Mvc;
namespace MyMvcApp.Helpers {
public class LocationHelper {
public static bool IsCurrentControllerAndAction(string controllerName, string actionName, ViewContext viewContext) {
bool result = false;
string normalizedControllerName = controllerName.EndsWith("Controller") ? controllerName : String.Format("{0}Controller", controllerName);
if(viewContext == null) return false;
if(String.IsNullOrEmpty(actionName)) return false;
if (viewContext.Controller.GetType().Name.Equals(normalizedControllerName, StringComparison.InvariantCultureIgnoreCase) &&
viewContext.Controller.ValueProvider.GetValue("action").AttemptedValue.Equals(actionName, StringComparison.InvariantCultureIgnoreCase)) {
result = true;
}
return result;
}
}
}
ビュー(またはマスター/レイアウト)では、次のように使用できます(Razor構文)。
<div id="menucontainer">
<ul id="menu">
<li @if(MyMvcApp.Helpers.LocationHelper.IsCurrentControllerAndAction("home", "index", ViewContext)) {
@:class="selected"
}>@Html.ActionLink("Home", "Index", "Home")</li>
<li @if(MyMvcApp.Helpers.LocationHelper.IsCurrentControllerAndAction("account","logon", ViewContext)) {
@:class="selected"
}>@Html.ActionLink("Logon", "Logon", "Account")</li>
<li @if(MyMvcApp.Helpers.LocationHelper.IsCurrentControllerAndAction("home","about", ViewContext)) {
@:class="selected"
}>@Html.ActionLink("About", "About", "Home")</li>
</ul>
</div>
それが役に立てば幸い。
これらのデータは、ViewContextのRouteDataから取得できます。
ViewContext.RouteData.Values["controller"]
ViewContext.RouteData.Values["action"]
MVCでは、ビューにすべてのデータを提供する必要があります。ビューに独自のデータを収集させないでください。そのため、コントローラーアクションでCSSクラスを設定することができます。
ViewData["CssClass"] = "bold";
そして、ビューのViewDataからこの値を選びます
私はこれに投票します2:
string currentActionName = ViewContext.RouteData.GetRequiredString("action");
そして
string currentViewName = ((WebFormView)ViewContext.View).ViewPath;
現在のビューの物理名とそれをトリガーしたアクションの両方を取得できます。ホストコンテナーを決定するために、部分的な* .acmxページで役立ちます。
Dale Raganの回答(彼の再利用の例)を拡張して、Controllerから派生するApplicationControllerクラスを作成し、他のすべてのコントローラーをControllerではなくそのApplicationControllerクラスから派生させます。
例:
public class MyCustomApplicationController : Controller {}
public class HomeController : MyCustomApplicationController {}
新しいApplicationControllerで、次のシグネチャを持つExecutingActionという名前のプロパティを作成します。
protected ActionDescriptor ExecutingAction { get; set; }
次に、OnActionExecutingメソッド(Dale Raganの回答から)で、このプロパティにActionDescriptorを割り当てるだけで、任意のコントローラーで必要なときにいつでもアクセスできます。
string currentActionName = this.ExecutingAction.ActionName;