我想在母版页中设置一个 CSS 类,它取决于当前的控制器和操作。我可以通过 ViewContext.Controller.GetType().Name
访问当前的控制器,但是如何获取当前的操作(例如 Index
,Show
等)?
我想在母版页中设置一个 CSS 类,它取决于当前的控制器和操作。我可以通过 ViewContext.Controller.GetType().Name
访问当前的控制器,但是如何获取当前的操作(例如 Index
,Show
等)?
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
并查看RouteData
集合来提取控制器和操作元素。 但是我认为,设置一些指示应用程序上下文(例如,“editmode”或“error”)的数据变量而不是控制器/操作可以减少视图和控制器之间的耦合。
获取视图上当前 ID:
ViewContext.RouteData.Values["id"].ToString()
获取当前控制器:
ViewContext.RouteData.Values["controller"].ToString()
ViewContext.RouteData.Values.ContainsKey(<key>)
进行检查。 - Pluto我知道这是一个比较旧的问题,但我看到了它并认为您可能对另一种版本感兴趣,而不是让您的视图处理检索所需数据的工作。
在我看来,更简单的方法是覆盖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.Values["controller"]
ViewContext.RouteData.Values["action"]
ViewData["CssClass"] = "bold";
然后在您的视图中从ViewData中挑选出这个值。
string currentActionName = ViewContext.RouteData.GetRequiredString("action");
并且
string currentViewName = ((WebFormView)ViewContext.View).ViewPath;
您可以获取当前视图的物理名称和触发它的操作。这在部分*.acmx页面中确定主机容器非常有用。
我正在使用ASP.NET MVC 4,以下是适合我的方法:
ControllerContext.Controller.ValueProvider.GetValue("controller").RawValue
ControllerContext.Controller.ValueProvider.GetValue("action").RawValue
在您的控制器中覆盖此函数
protected override void HandleUnknownAction(string actionName)
{ TempData["actionName"] = actionName;
View("urViewName").ExecuteResult(this.ControllerContext);
}
ViewContext.Controller.ValueProvider.GetValue("action").RawValue
及其变体。 - Chris SViewContext.RouteData.Values["action"], ViewContext.RouteData.Values["controller"], ViewContext.RouteData.Values["id"],
- Tomas Kubes