Asp.Net MVC: How to determine if you're currently on a specific view

前端 未结 3 1759
佛祖请我去吃肉
佛祖请我去吃肉 2021-02-06 01:22

I need to determine if I\'m on a particular view. My use case is that I\'d like to decorate navigation elements with an \"on\" class for the current view. Is there a built in

相关标签:
3条回答
  • 2021-02-06 01:59

    My current solution is with extension methods:

    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);
        }
    }
    
    0 讨论(0)
  • 2021-02-06 02:16

    Here is something a little different, use a 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);
        }
    }
    

    ...

    And in the view:

    <%= ViewData["NavigationLocation"] %>
    
    0 讨论(0)
  • 2021-02-06 02:17

    Here what i am using. I think this is actually generated by the MVC project template in VS:

    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;
        }
    
    0 讨论(0)
提交回复
热议问题