我想在我的母版页中设置一个CSS类,这取决于当前控制器和动作。我可以通过ViewContext.Controller.GetType()访问当前控制器。名称,但我如何得到当前的行动(如索引,显示等)?
当前回答
你可以从ViewContext的RouteData中获取这些数据
ViewContext.RouteData.Values["controller"]
ViewContext.RouteData.Values["action"]
其他回答
获取视图的当前Id:
ViewContext.RouteData.Values["id"].ToString()
获取当前控制器。
ViewContext.RouteData.Values["controller"].ToString()
在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"]
我知道这是一个老问题,但我看到了它,我认为您可能对一个替代版本感兴趣,而不是让您的视图处理检索它需要的数据。
在我看来,一个更简单的方法是重写onactionexecution方法。你被传递一个ActionExecutingContext,它包含ActionDescriptor成员,你可以用它来获取你正在寻找的信息,也就是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.
}
希望这能有所帮助。如果有什么不同的话,至少它会为其他问你问题的人提供一种选择。
扩展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;
我使用ASP。NET MVC 4,这是为我工作:
ControllerContext.Controller.ValueProvider.GetValue("controller").RawValue
ControllerContext.Controller.ValueProvider.GetValue("action").RawValue
推荐文章
- .NET中的Map和Reduce
- 我如何能使一个组合框不可编辑的。net ?
- 在ASP中实现请求节流的最佳方法。净MVC吗?
- .NET反射的成本有多高?
- 实体框架回滚并移除不良迁移
- 将流转换为字符串并返回
- 在c#中检查字符串是否只包含数字的最快方法
- IEquatable和重写Object.Equals()之间的区别是什么?
- 创建一个堆栈大小为默认值50倍的线程有什么危险?
- 转换JSON字符串到JSON对象c#
- 显示两个datetime值之间的小时差值
- 如何设置enum为空
- 选择Enum类型的默认值而无需更改值
- 我如何设置在一个组合框中选择的项目,以匹配我的字符串使用c# ?
- String与StringBuilder