Pregunta ¿Cómo determinar el Prefijo de Ruta programáticamente en asp.net mvc?


Quería proporcionar un poco de separación de URL para mis controladores públicos / anónimos y vistas desde el administrador / controladores y vistas autenticados. Así que terminé usando completamente Enrutamiento de atributos con el fin de tomar más control de mis URLs. Quería que mis URL públicas comenzaran con "~ / Admin / etc". mientras que mis URL públicas no tendrían dicho prefijo.

Controlador Público (uno de varios)

[RoutePrefix("Home")]
public class HomeController : Controller
{
    [Route("Index")]
    public ActionResult Index()
    { //etc. }
}

Controlador de administración (uno de varios)

[RoutePrefix("Admin/People")]
public class PeopleController : Controller
{
    [Route("Index")]
    public ActionResult Index()
    { //etc. }
}

Esto me permite tener URLs públicas como:

http://myapp/home/someaction

... y admin / URL autenticadas como:

http://myapp/admin/people/someaction

Pero ahora quiero hacer algunas cosas dinámicas en las vistas en función de si el usuario está en la sección de administración o en la sección pública del sitio. ¿Cómo puedo acceder a esto programáticamente, de forma adecuada?

Sé que podría hacer algo como

if (Request.Url.LocalPath.StartsWith("/Admin"))

... pero se siente "hacky". Sé que puedo acceder a los nombres de controlador y acción a través de

HttpContext.Current.Request.RequestContext.RouteData.Values

... pero la pieza "admin" no se refleja allí, porque es solo un prefijo de ruta, no un nombre de controlador real.

Entonces, la pregunta básica es, ¿cómo puedo determinar mediante programación si la vista cargada actualmente está o no en la sección "admin"?


5
2018-03-14 05:01


origen


Respuestas:


Solo necesitas reflejar el RoutePrefixAttribute desde el Controller tipo, y luego obtener su Prefix valor. los Controller instancia está disponible en el ViewContext.

Este ejemplo crea una práctica ayuda HTML que engloba todos los pasos en una sola llamada.

using System;
using System.Web.Mvc;

public static class RouteHtmlHelpers
{
    public static string GetRoutePrefix(this HtmlHelper helper)
    {
        // Get the controller type
        var controllerType = helper.ViewContext.Controller.GetType();

        // Get the RoutePrefix Attribute
        var routePrefixAttribute = (RoutePrefixAttribute)Attribute.GetCustomAttribute(
            controllerType, typeof(RoutePrefixAttribute));

        // Return the prefix that is defined
        return routePrefixAttribute.Prefix;
    }
}

Entonces, en su opinión, solo necesita llamar al método de extensión para obtener el valor del RoutePrefixAttribute.

@Html.GetRoutePrefix() // Returns "Admin/People"

8
2018-03-14 15:50