web-dev-qa-db-fra.com

MVC 4 Supprimer "Home" de la route de base

Fondamentalement, je veux le faire pour que: http://website.com/home/about

Apparaît comme : http://website.com/about

Le contrôleur "Accueil" montrant dans l'URL rendrait l'URL plus longtemps que l'utilisateur de lire.

J'ai essayé de faire ce qui suit:

routes.MapRoute(
            name: "About",
            url: "",
            defaults: new { controller = "Home", action = "About", id = UrlParameter.Optional }
            );

Quelqu'un pourrait-il m'aider s'il vous plaît?

34
BRogers

Essaye ça. Cela rend également vos URL minuscules.

        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.LowercaseUrls = true;

        routes.MapMvcAttributeRoutes();

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

Et dans votre contrôleur domestique:

    [Route("About")]
    public ActionResult About()
    {
        return View();
    }
8
Eric Murr

Étape 1 : Créer la contrainte d'itinéraire.

public class RootRouteConstraint<T> : IRouteConstraint
    {
        public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
        {
            var rootMethodNames = typeof(T).GetMethods().Select(x => x.Name.ToLower());
            return rootMethodNames.Contains(values["action"].ToString().ToLower());
        }
    }

étape 2 :
[.____] ajoutez une nouvelle itinéraire mappage au-dessus de votre cartographie par défaut qui utilise la contrainte d'itinéraire que nous venons de créer. Le paramètre générique doit être la classe du contrôleur que vous prévoyez d'utiliser comme contrôleur "racine".

routes.MapRoute(
                "Root",
                "{action}",
                new {controller = "Home", action = "Index", id = UrlParameter.Optional},
                new {isMethodInHomeController = new RootRouteConstraint<HomeController>()});




 routes.MapRoute(
                    "Default",
                    "{controller}/{action}/{id}",
                    new
                    {controller = "Home", action = "Index", id = UrlParameter.Optional}
                    );

Maintenant, vous devriez pouvoir accéder à vos méthodes de contrôleur domestique, comme: exemple exemple/about, exemple.com/contact

Cela n'affectera que Homecontroller. Les autres contrôleurs d'AllL auront la fonctionnalité de routage par défaut.

2
Rahul