2012-01-04 9 views
5

Quando uso Html.ActionLink() l'URL creato non è nel formato desiderato:?MVC routing Html.ActionLink crea URL con id = 1 invece di/id

Html.ActionLink(Model.ProductCode, "Update", new { id = Model.ProductId }) 

rende questo URL

/Update?id=1 

quando voglio avere questo URL:

/Update/1 

Quali sono le opzioni di routing creare il 2 ° URL? Questo è il nostro stile di URL preferito.

Entrambi gli URL funzionano e viene visualizzata la pagina corretta - ma vogliamo solo uso/id

In Global.asax il percorso di default MVC gestisce entrambi gli URL

routes.MapRoute(
    "Default",            // Route name 
    "{controller}/{action}/{id}",       // URL with parameters 
    new { controller = "Home", action = "Index", id = "" }); // Parameter defaults 
+0

Avete un percorso che corrisponderebbe a quello? – SLaks

+0

Puoi pubblicare i percorsi su global.asax? – epignosisx

+0

Entrambi i percorsi sono attualmente validi. Voglio solo ActionLink per generare l'URL nel nostro formato preferito. –

risposta

3

posso replicare il problema avere una rotta sulla mia rotta predefinita che corrisponde ancora al modello generale. Esempio:

routes.MapRoute(
          "Default2", // Route name 
          "{controller}/{action}", // URL with parameters 
          new { controller = "Home", action = "Index"} // Parameter defaults 
         ); 

Quando posizioni sopra la mia route predefinita, ottengo il? Id = 1 nel mio URL. Puoi confermare che questo ActionLink non corrisponde ad alcun percorso sopra la rotta che ti aspetti che corrisponda?

EDIT: Il sotto non influisce l'URL

Tuttavia, potrebbe ancora essere vantaggioso utilizzare l'UrlParameter.Optional in altri scenari. Lasciando per prosperità a meno che la regola della mob non dica diversamente.

new UrlParameter.Optional value. Se si imposta il valore predefinito per un parametro URL su questo valore speciale, MVC si assicura di rimuovere quella chiave dal dizionario del valore del percorso in modo che non esista.

Penso che sia necessario regolare leggermente il percorso. Modifica id = "" per id = UrlParameter.Optional

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

Questo è quello che usiamo per la route di default e il comportamento che si sta cercando è come le nostre applicazioni si comportano.

+0

termina ancora con? Id = 1 –

+0

JK - L'ho appena verificato mentre vedevo se potevo creare l'app MVC? usando l'URL. Ci sono altri percorsi sopra la rotta predefinita a cui MVC potrebbe corrispondere? Sarebbe possibile vedere l'intera tabella del percorso? – Tommy

0

Vedere This question/answer.

Quale versione di MVC stai utilizzando? Se ti trovi in ​​MVC3, dovrai aggiungere un quarto parametro alla tua chiamata a Html.ActionLink(), passando in uno null.

0

Mi sono appena imbattuto in questo e ho deciso di rispondere. È risultato che sia Url.Action() che Html.ActionLink() utilizzano il primo percorso nella raccolta di rotte per formattare l'URL risultante. Quindi, il percorso prima mappato nei RegisterRoutes() shoild essere:

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

invece di "{Controller}/{action}/{id}". Il nome della rotta (ad es."Predefinito") non importa, solo l'ordine è importante

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