我想在我的母版页中设置一个CSS类,这取决于当前控制器和动作。我可以通过ViewContext.Controller.GetType()访问当前控制器。名称,但我如何得到当前的行动(如索引,显示等)?


当前回答

我使用ASP。NET MVC 4,这是为我工作:

ControllerContext.Controller.ValueProvider.GetValue("controller").RawValue
ControllerContext.Controller.ValueProvider.GetValue("action").RawValue

其他回答

扩展Dale Ragan的回答,他的重用示例,创建一个派生于Controller的ApplicationController类,然后让所有其他控制器派生于这个ApplicationController类,而不是Controller。

例子:

public class MyCustomApplicationController : Controller {}

public class HomeController : MyCustomApplicationController {}

在你的新ApplicationController上创建一个名为ExecutingAction的属性,带有这个签名:

protected ActionDescriptor ExecutingAction { get; set; }

然后在onactionexecution方法中(来自Dale Ragan的回答),简单地将ActionDescriptor分配给这个属性,你可以在任何控制器中随时访问它。

string currentActionName = this.ExecutingAction.ActionName;

在RC中,你也可以提取路由数据,比如action方法名

ViewContext.Controller.ValueProvider["action"].RawValue
ViewContext.Controller.ValueProvider["controller"].RawValue
ViewContext.Controller.ValueProvider["id"].RawValue

针对MVC 3的更新

ViewContext.Controller.ValueProvider.GetValue("action").RawValue
ViewContext.Controller.ValueProvider.GetValue("controller").RawValue
ViewContext.Controller.ValueProvider.GetValue("id").RawValue

针对MVC 4的更新

ViewContext.Controller.RouteData.Values["action"]
ViewContext.Controller.RouteData.Values["controller"]
ViewContext.Controller.RouteData.Values["id"]

MVC 4.5更新

ViewContext.RouteData.Values["action"]
ViewContext.RouteData.Values["controller"]
ViewContext.RouteData.Values["id"]

在控制器中重写此函数

protected override void HandleUnknownAction(string actionName) 
{  TempData["actionName"] = actionName;
   View("urViewName").ExecuteResult(this.ControllerContext);
}

你可以从ViewContext的RouteData中获取这些数据

ViewContext.RouteData.Values["controller"]
ViewContext.RouteData.Values["action"]

在MVC中,你应该为视图提供所有的数据,而不是让视图收集自己的数据,所以你能做的就是在你的控制器动作中设置CSS类。

ViewData["CssClass"] = "bold";

并从视图中的ViewData中选取这个值