Asp.Net MVC: как получить виртуальный URL-адрес для текущего контроллера/представления?

Можно ли получить маршрут/виртуальный URL-адрес, связанный с действием контроллера или представлением? Я видел, что в Preview 4 добавлен помощник LinkBuilder.BuildUrlFromExpression, но он не очень полезен, если вы хотите использовать его на мастере, поскольку тип контроллера может быть другим. Любые мысли приветствуются.


person Jim Geurts    schedule 30.09.2008    source источник


Ответы (5)


Я всегда стараюсь реализовать самое простое решение, отвечающее требованиям проекта. Как сказал Энштейн: «Сделайте все как можно проще, но не проще». Попробуй это.

<%: Request.Path %>
person Tarzan    schedule 25.01.2011

Это сработало для меня:

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

Он возвращает текущий URL как таковой; /Home/About

Может быть, есть более простой способ вернуть фактическую строку маршрута?

person Community    schedule 28.03.2009

Вы можете получить эти данные из ViewContext.RouteData. Ниже приведены несколько примеров того, как получить доступ (и использовать) эту информацию:

/// Они добавляются к моим базовым классам viewmasterpage, viewpage и viewusercontrol:

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);
}

/// Некоторые методы расширения, которые я добавил в класс UrlHelper.

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());
    }
}
person Jim Geurts    schedule 12.08.2009
comment
Предупреждение: этот код больше не работает в ASP.NET MVC 5. - person qJake; 28.03.2015
comment
@qJake Тогда как обмениваться данными между контроллерами в MVC5? - person Mrunal; 06.07.2016
comment
@Mrunal Этот вопрос касается не обмена данными между контроллерами, а скорее того, как просматривать маршруты, связанные с контроллером. Я знаю, что это возможно с ASP.NET MVC 5 (теперь ASP.NET Core), но я не знаю синтаксиса навскидку. - person qJake; 06.07.2016
comment
@qJake: спасибо. На самом деле я начал проект с ASP.Net Core, используя MVC 5. В нем я пытался использовать HttpContext.Current.Session, но я не могу получить доступ к тому же в своих классах утилит, где я хотел бы установить-получить переменные. Потому что я думаю, как только я получу это, я смогу передавать данные между контроллерами через сеанс. - person Mrunal; 07.07.2016

Вы можете использовать ‹%= Url.Action(действие, контроллер, значения) %> для создания URL-адреса на главной странице.

Вы делаете это, чтобы выделить вкладку для текущей страницы или что-то в этом роде?

Если это так, вы можете использовать ViewContext из представления и получить нужные вам значения.

person Ben Scheirman    schedule 30.09.2008

Я написал вспомогательный класс, который позволяет мне получить доступ к параметры маршрута. С помощью этого помощника вы можете получить контроллер, действие и все параметры, переданные действию.

person Jim Geurts    schedule 28.02.2009