2013-07-18 16 views
14

Come nota a margine, ho compreso l'intero problema ambiguous controller names e ho utilizzato lo spazio dei nomi per far funzionare i percorsi, quindi non penso che sia un problema qui.Utilizzo di Url.RouteUrl() con i nomi delle route in un'area

Finora ho i miei regolatori di livello di progetto e quindi un'area dell'utente con il seguente registrazione:

public class UserAreaRegistration : AreaRegistration 
{ 
    public override string AreaName 
    { 
     get 
     { 
      return "User"; 
     } 
    } 

    public override void RegisterArea(AreaRegistrationContext context) 
    { 
     context.MapRoute(
      "UserHome", 
      "User/{id}", 
      new { action = "Index", controller = "Home", id = 0 }, 
      new { controller = @"Home", id = @"\d+" } 
     ); 

     context.MapRoute(
      "UserDefault", 
      "User/{controller}/{action}/{id}", 
      new { action = "Index", id = UrlParameter.Optional } 
     ); 
    } 
} 

Il "UserHome" percorso c'è così posso permettere il percorso /User/5 vs /User/Home/Index/5 che sembra più pulito IMO .

Idealmente mi piacerebbe utilizzare Url.RouteUrl("UserHome", new { id = 5 }), per generare il percorso altrove, ma questo sempre o torna vuoto o mi dà un'eccezione dicendo che non riesce a trovare il nome del percorso, che è ovviamente lì.

Tuttavia quando uso Url.RouteUrl("UserHome", new { controller = "Home", action = "Index", id = 5 }) non funziona alcun problema.

Perché è necessario specificare l'azione e il controller quando sono già presenti dei valori predefiniti nella mappatura del percorso? Cosa mi manca?

+0

Provare ad aggiungere lo spazio dei nomi. – Oasis

risposta

2

Posso confermare che con .NET 4.5.1 e 5.2.2 MVC al minimo, che questo comportamento è stato risolto e ora lavora come è con questo stesso codice esatto utilizzando Url.RouteUrl("UserHome", new { id = 5 }).

Sembra che questo sia un bug che è stato risolto dal momento del mio post.

Aggiungendo questo come risposta in quanto la soluzione di TSmith avrebbe funzionato, non è più necessario fare quel lavoro extra ora che c'è una soluzione.

+1

Sembra non funzionare con il routing degli attributi nel mio mvc 5.2.3 [Route ("Utente/{id}", Name = "UserHome")] –

6

Non sono sicuro se è stata eseguita una correzione rapida, ma il comportamento ora è leggermente diverso. Utilizzando il codice esatto e cercando:

Url.RouteUrl("UserHome", new { id = 5 }) 

ora ottengo:

/User/5?httproute=True 

Questo sembra ancora scomodo, quindi ho sperimentato con il percorso e aggiunto un altro param di default:

context.MapRoute(
      "UserHome", 
      "User/{id}", 
      new { action = "Index", controller = "Home", area = "User", id = 0, 
         httproute = true }, 
      new { controller = @"Home", id = @"\d+" } 
     ); 

Ora quando uso

Url.RouteUrl("UserHome", new { id = 5 }) 

ottengo un bel URL del

/User/5 

diniego Ci potrebbero essere effetti collaterali indesiderati di httproute=true nella dichiarazione percorso.

Inoltre, l'uso più prolisso:

@Url.RouteUrl("UserHome", new { controller = "Home", action = "Index", id = 5 }) 

funziona ancora così.

2

Prova questo:

@Url.Action("Index", "Home", new { Area = "User" }) 
+0

Ottima risposta :) –

Problemi correlati