【问题标题】:Asp.Net MVC: How to determine if you're currently on a specific viewAsp.Net MVC:如何确定您当前是否在特定视图上
【发布时间】:2010-09-07 14:52:16
【问题描述】:

我需要确定我是否处于特定视图中。我的用例是我想用当前视图的“on”类来装饰导航元素。有内置的方法吗?

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    这是我正在使用的。我认为这实际上是由VS中的MVC项目模板生成的:

    public static bool IsCurrentAction(this HtmlHelper helper, string actionName, string controllerName)
        {
            string currentControllerName = (string)helper.ViewContext.RouteData.Values["controller"];
            string currentActionName = (string)helper.ViewContext.RouteData.Values["action"];
    
            if (currentControllerName.Equals(controllerName, StringComparison.CurrentCultureIgnoreCase) && currentActionName.Equals(actionName, StringComparison.CurrentCultureIgnoreCase))
                return true;
    
            return false;
        }
    

    【讨论】:

      【解决方案2】:

      我目前的解决方案是使用扩展方法:

      public static class UrlHelperExtensions
      {
          /// <summary>
          /// Determines if the current view equals the specified action
          /// </summary>
          /// <typeparam name="TController">The type of the controller.</typeparam>
          /// <param name="helper">Url Helper</param>
          /// <param name="action">The action to check.</param>
          /// <returns>
          ///     <c>true</c> if the specified action is the current view; otherwise, <c>false</c>.
          /// </returns>
          public static bool IsAction<TController>(this UrlHelper helper, LambdaExpression action) where TController : Controller
          {
              MethodCallExpression call = action.Body as MethodCallExpression;
              if (call == null)
              {
                  throw new ArgumentException("Expression must be a method call", "action");
              }
      
              return (call.Method.Name.Equals(helper.ViewContext.ViewName, StringComparison.OrdinalIgnoreCase) &&
                      typeof(TController) == helper.ViewContext.Controller.GetType());
          }
      
          /// <summary>
          /// Determines if the current view equals the specified action
          /// </summary>
          /// <param name="helper">Url Helper</param>
          /// <param name="actionName">Name of the action.</param>
          /// <returns>
          ///     <c>true</c> if the specified action is the current view; otherwise, <c>false</c>.
          /// </returns>
          public static bool IsAction(this UrlHelper helper, string actionName)
          {
              if (String.IsNullOrEmpty(actionName))
              {
                  throw new ArgumentException("Please specify the name of the action", "actionName");
              }
              string controllerName = helper.ViewContext.RouteData.GetRequiredString("controller");
              return IsAction(helper, actionName, controllerName);
          }
      
          /// <summary>
          /// Determines if the current view equals the specified action
          /// </summary>
          /// <param name="helper">Url Helper</param>
          /// <param name="actionName">Name of the action.</param>
          /// <param name="controllerName">Name of the controller.</param>
          /// <returns>
          ///     <c>true</c> if the specified action is the current view; otherwise, <c>false</c>.
          /// </returns>
          public static bool IsAction(this UrlHelper helper, string actionName, string controllerName)
          {
              if (String.IsNullOrEmpty(actionName))
              {
                  throw new ArgumentException("Please specify the name of the action", "actionName");
              }
              if (String.IsNullOrEmpty(controllerName))
              {
                  throw new ArgumentException("Please specify the name of the controller", "controllerName");
              }
      
              if (!controllerName.EndsWith("Controller", StringComparison.OrdinalIgnoreCase))
              {
                  controllerName = controllerName + "Controller";
              }
      
              bool isOnView = helper.ViewContext.ViewName.SafeEquals(actionName, StringComparison.OrdinalIgnoreCase);
              return isOnView && helper.ViewContext.Controller.GetType().Name.Equals(controllerName, StringComparison.OrdinalIgnoreCase);
          }
      }
      

      【讨论】:

        【解决方案3】:

        这里有点不同,使用 FilterAttribute:

            [NavigationLocationFilter("Products")]
            public ViewResult List()
            {
                return View();
            }
        

        ...

        public class NavigationLocationFilterAttribute : ActionFilterAttribute
        {
            public string CurrentLocation { get; set; }
        
            public NavigationLocationFilterAttribute(string currentLocation)
            {
                CurrentLocation = currentLocation;
            }
        
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                var controller = (Controller)filterContext.Controller;
                controller.ViewData.Add("NavigationLocation", CurrentLocation);
            }
        }
        

        ...

        在视图中:

        <%= ViewData["NavigationLocation"] %>
        

        【讨论】:

          猜你喜欢
          • 2023-04-04
          • 1970-01-01
          • 2011-03-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多