2010-07-26 16 views
31

Desidero rimuovere il nome del controller dall'URL (per un controller specifico). Per esempio:ASP.NET MVC - Rimozione del nome del controller dall'URL

http://mydomain.com/MyController/MyAction

vorrei questo URL per essere cambiato in:

http://mydomain.com/MyAction

Come posso fare per fare questo in MVC? Sto usando MVC2 se questo mi aiuta comunque.

+0

Controllare il collegamento seguente aiuterà [Come rimuovere il nome del controller dall'URL utilizzando la rotta in MVC] (https://stackoverflow.com/questions/34650332/how-to-remove-the-controller-name-from- the-url-con-rotta-in-mvc/34653793 # 34653793). –

+0

VEDERE AGGIORNAMENTO 2016 IN BASSO – niico

risposta

40

Si dovrebbe mappare nuova rotta nel global.asax (aggiungerlo prima di quella di default), per esempio:

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

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

In MVC 4 ho dovuto farlo in RouteConfig.cs. Rimuove anche il percorso predefinito, non è abbastanza per mettere la linea prima. – David

+0

@David, il motivo per cui è stato necessario rimuovere la route predefinita è perché l'azione dell'indice Home predefinito corrisponde a 'routes.MapRoute (" Default "," {controller}/{action}/{id} ", new {controller =" Home ", action =" Index ", id = UrlParameter.Optional}); Impone l'azione Indice MyController per il rendering anziché l'azione Indice del controller domestico perché la tua chiamata alla home page si qualifica per quel "percorso". È possibile sostituire {action} con il nome effettivo del metodo senza parentesi graffe e lo chiamerà SOLO quando si effettua una chiamata a quell'azione specifica. – TarasBulba

+0

Vedere la risposta al routing degli attributi di seguito. – niico

0

dovrete modificare i percorsi predefiniti per MVC. C'è una spiegazione dettagliata sul blog di ScottGu: http://weblogs.asp.net/scottgu/archive/2007/12/03/asp-net-mvc-framework-part-2-url-routing.aspx

Il metodo che dovresti cambiare è Application_Start. Qualcosa di simile al seguente potrebbe aiutare:

RouteTable.Routes.Add(new Route(
    Url="MyAction" 
    Defaults = { Controller = "MyController", action = "MyAction" }, 
    RouteHandler = typeof(MvcRouteHandler) 
} 

L'ordine dei percorsi è significativo. Si fermerà alla prima partita. Quindi quello predefinito dovrebbe essere l'ultimo.

-2
routes.MapRoute("SpecificRoute", "MyController/{action}/{id}", 
     new {controller = "MyController", action = "Index", 
     id = UrlParameter.Optional}); 

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

'SpecificRoute' corrisponderà solo se' MyController' è nell'URL, il punto della domanda è quello di * escludere * il controller dall'URL. Vedi la risposta di @rrejc. – James

3

Ecco i passaggi per nome del controller di rimuovere dal HomeController

Fase 1: creare il vincolo percorso.

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

Fase 2:
aggiungere un nuovo mapping percorso sopra la mappatura predefinita che utilizza il vincolo percorso che abbiamo appena creato. Il parametro generico dovrebbe essere la classe controller che si intende utilizzare come controller "Root".

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

Ora si dovrebbe essere in grado di accedere ai metodi del controller a casa in questo modo: example.com/about, example.com/contact

Questo sarà influisce solo HomeController. Tutti gli altri controller avranno la funzionalità di routing predefinita.

8

Per aggiornare questo per il 2016 - il modo migliore per farlo è utilizzare l'instradamento di attributi.

Il problema di fare questo in RouteConfig.cs è che il vecchio percorso sarà inoltre continuerà a funzionare - in modo da avere entrambi

http://example.com/MyController/MyAction

E

http://example.com/MyAction

avere più i percorsi verso la stessa pagina sono negativi per il SEO - possono causare problemi con il percorso e creare pagine di zombi ed errori in tutta la tua app.

Con il routing degli attributi si evitano questi problemi. Tutto quello che dovete fare è aggiungere questo per RouteConfig.cs (probabilmente in cima prima di altri percorsi possono abbinare):

routes.MapMvcAttributeRoutes(); 

quindi aggiungere il percorso attribuire a ciascuna azione con il nome della rotta, ad esempio

[Route("MyAction")] 
public ActionResult MyAction() 
{ 
... 
} 
Problemi correlati