Asp.Net MVC: How do I get virtual url for the current controller/view?

前端 未结 5 1986
谎友^
谎友^ 2020-12-24 07:33

Is it possible to get the route/virtual url associated with a controller action or on a view? I saw that Preview 4 added LinkBuilder.BuildUrlFromExpression helper, but it\'

相关标签:
5条回答
  • 2020-12-24 08:09

    I wrote a helper class that allows me to access the route parameters. With this helper, you can get the controller, action, and all parameters passed to the action.

    0 讨论(0)
  • 2020-12-24 08:12

    I always try to implement the simplest solution that meets the project requirements. As Enstein said, "Make things as simple as possible, but not simpler." Try this.

    <%: Request.Path %>
    
    0 讨论(0)
  • 2020-12-24 08:17

    You can use <%= Url.Action(action, controller, values) %> to build the URL from within the master page.

    Are you doing this to maybe highlight a tab for the current page or something?

    If so you can use ViewContext from the view and get the values you need.

    0 讨论(0)
  • 2020-12-24 08:19

    This worked for me:

    <%= this.Url.RouteUrl(this.ViewContext.RouteData.Values) %>

    It returns the current Url as such; /Home/About

    Maybe there is a simpler way to return the actual route string?

    0 讨论(0)
  • 2020-12-24 08:27

    You can get that data from ViewContext.RouteData. Below are some examples for how to access (and use) that information:

    /// These are added to my viewmasterpage, viewpage, and viewusercontrol base classes:

    public bool IsController(string controller)
    {
        if (ViewContext.RouteData.Values["controller"] != null)
        {
            return ViewContext.RouteData.Values["controller"].ToString().Equals(controller, StringComparison.OrdinalIgnoreCase);
        }
        return false;
    }
    public bool IsAction(string action)
    {
        if (ViewContext.RouteData.Values["action"] != null)
        {
            return ViewContext.RouteData.Values["action"].ToString().Equals(action, StringComparison.OrdinalIgnoreCase);
        }
        return false;
    }
    public bool IsAction(string action, string controller)
    {
        return IsController(controller) && IsAction(action);
    }
    

    /// Some extension methods that I added to the UrlHelper class.

    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);
        }
    
        /// <summary>
        /// Determines if the current request is on the specified controller
        /// </summary>
        /// <param name="helper">The helper.</param>
        /// <param name="controllerName">Name of the controller.</param>
        /// <returns>
        ///     <c>true</c> if the current view is on the specified controller; otherwise, <c>false</c>.
        /// </returns>
        public static bool IsController(this UrlHelper helper, string controllerName)
        {
            if (String.IsNullOrEmpty(controllerName))
            {
                throw new ArgumentException("Please specify the name of the controller", "controllerName");
            }
    
            if (!controllerName.EndsWith("Controller", StringComparison.OrdinalIgnoreCase))
            {
                controllerName = controllerName + "Controller";
            }
    
            return helper.ViewContext.Controller.GetType().Name.Equals(controllerName, StringComparison.OrdinalIgnoreCase);
        }
    
        /// <summary>
        /// Determines if the current request is on the specified controller
        /// </summary>
        /// <typeparam name="TController">The type of the controller.</typeparam>
        /// <param name="helper">The helper.</param>
        /// <returns>
        ///     <c>true</c> if the current view is on the specified controller; otherwise, <c>false</c>.
        /// </returns>
        public static bool IsController<TController>(this UrlHelper helper) where TController : Controller
        {
            return (typeof(TController) == helper.ViewContext.Controller.GetType());
        }
    }
    
    0 讨论(0)
提交回复
热议问题