2010-06-10 3 views
7

sto migrazione di un sito da ASP.NET MVC 1 per ASP.NET MVC 2. Al momento, il sito supporta i seguenti percorsi:ASP.NET MVC 2 - do UrlParameter.Le voci opzionali devono trovarsi alla fine del percorso?

/{country}/{language}/{controller}/{action} 
/{country}/{controller}/{action} 
/{language}/{controller}/{action} 
/{controller}/{action} 

I formati per country e language sono distinguibili da Regex e hanno vincoli adeguati. In MVC 1, ho registrato ciascuno di questi come percorso separato - per ciascuna delle circa 20 combinazioni. In MVC 2, ho cercato di ottenere la stessa cosa lavorando con un solo percorso per coprire tutti e quattro i casi, usando UrlParameter.Optional, ma non riesco a farlo funzionare - se definisco country e language come entrambi facoltativi, quindi il percorso Ad esempio, /Home/Index non corrisponde alla rotta. Questo è quello che sto cercando di fare:

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

Questo è solo impossibile, perché i miei optional sono all'inizio del percorso, o sto solo perdendo qualcosa? Non riesco a trovare alcuna documentazione per dirmi che cosa sto facendo è impossibile o per indicarmi la giusta direzione.

+0

Sono anche interessato al trucco per ottenere un tale sistema di routing se è possibile ... –

+0

Piuttosto che specificarli tutti in uno, perché non definire solo più percorsi per gestirlo? –

+0

Se leggi la parte centrale della domanda, è quello che sto facendo al momento. Ma in quattro combinazioni moltiplicano 20 diversi tipi di percorso che sono un sacco di mappe. Sto cercando di scoprire se posso semplificare questo utilizzando UrlParameter.Optional. –

risposta

2

Hmm. Interessante.

Ecco il meglio che ho potuto inventare. Immagino che questa sia una cattiva idea, ma è l'unica soluzione alternativa a cui potrei pensare. Sarei interessato a sentire alcuni suggerimenti/dubbi/reclami.

Si potrebbe tracciare un percorso miope come questo:

routes.MapRoute(
    "Localized", 
    "{*loc}", 
    new { controller = "Localizer", action = "RedirectIt" }, 
    new { loc = REGEX_CONSTRAINT_FOR_ENTIRE_ROUTE_VALUE } 
); 

Poi, nel controller Localizer, è possibile reindirizzare all'azione corretto però vuoi:

public class LocalizerController : Controller 
{ 
    public ActionResult RedirectIt(string loc) 
    { 
     //split up the loc string 
     //and determine the correct redirect path for the request 
    } 
} 

Sono un uomo dai trucchi a buon mercato. Cosa posso dire?

+0

Bene, vale un +1 per essere l'unica risposta e venire con qualcosa che potrebbe essere praticabile - ma ovviamente preferirei evitare il reindirizzamento. Grazie comunque. –

+0

Sì. Non è carino E non lo userei da solo. Ma, hey, penso che potrebbe essere l'unica opzione praticabile. –

+0

Beh, è ​​sicuramente la migliore risposta che ho avuto (!), Quindi ottiene il segno di spunta ... –