Asp.Net MVC: Comment obtenir une URL virtuelle pour le contrôleur / la vue actuels?

StackOverflow https://stackoverflow.com/questions/151963

  •  02-07-2019
  •  | 
  •  

Question

Est-il possible d’obtenir la route / URL virtuelle associée à une action du contrôleur ou à une vue? J'ai vu que Preview 4 avait ajouté l'assistant LinkBuilder.BuildUrlFromExpression, mais ce n'est pas très utile si vous souhaitez l'utiliser sur le maître, car le type de contrôleur peut être différent. Toutes les pensées sont appréciées.

Était-ce utile?

La solution 3

Vous pouvez obtenir ces données à partir de ViewContext.RouteData. Vous trouverez ci-dessous des exemples d’accès (et d’utilisation) de ces informations:

/// Elles sont ajoutées à mes classes de base viewmasterpage, viewpage et 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);
}

/// Certaines méthodes d'extension que j'ai ajoutées à la classe 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());
    }
}

Autres conseils

J'essaie toujours d'implémenter la solution la plus simple qui réponde aux exigences du projet. Comme le dit Enstein, & "Faites les choses aussi simples que possible, mais pas plus simples. &"; Essaye ça.

<%: Request.Path %>

Cela a fonctionné pour moi:

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

Il retourne l’URL actuelle en tant que telle; /Home/About

Peut-être existe-t-il un moyen plus simple de renvoyer la chaîne de route réelle?

Vous pouvez utiliser <% = Url.Action (action, contrôleur, valeurs)% > pour construire l'URL depuis la page maître.

Faites-vous cela pour peut-être mettre en surbrillance un onglet pour la page actuelle ou quelque chose?

Si c'est le cas, vous pouvez utiliser ViewContext à partir de la vue et obtenir les valeurs dont vous avez besoin.

J'ai écrit une classe d'assistance qui me permet de pour accéder aux paramètres de route. Avec cet assistant, vous pouvez obtenir le contrôleur, l'action et tous les paramètres transmis à l'action.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top