5

non riesco a @Url.Action per risolvere all'url mi aspetto sulla base del percorso dell'attributo ho applicato:MVC attributo di routing con Url.Action non risolvere percorso

mia azione (SearchController ma con [RoutePrefix ("add ")])

 [Route("{searchTerm}/page/{page?}", Name = "NamedSearch")] 
    [Route("~/add")] 
    public ActionResult Index(string searchTerm = "", int page = 1) 
    { 
     ... 
    } 

Chiama per Url.Action

@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1 }) 

Questo si traduce in un URL di

/add?searchTerm=replaceMe&page=1

mi aspetterei

/add/replaceMe/page/1

Se digitate l'URL manualmente, allora si risolve per l'azione corretta con i parametri corretti Perché @Url.Action non risolve l'URL corretto?

risposta

11

Poiché si dispone di un nome per la tua bella definizione di percorso, è possibile utilizzare il metodo RouteUrl.

@Url.RouteUrl("NamedSearch", new { searchTerm = "replaceMe", page = 1}) 

E in quanto è necessario aggiungere l'URL, è necessario aggiornare la tua definizione percorso per includere che nel modello URL.

[Route("~/add")] 
[Route("~/add/{searchTerm?}/page/{page?}", Name = "NamedSearch")] 
public ActionResult Index(string searchTerm = "", int page = 1) 
{ 
// to do : return something 
} 
+1

Grazie, l'aggiunta di un nome per entrambi i percorsi e l'utilizzo di RouteUrl è stato l'unico modo affidabile per ottenere questo risultato per entrambe le rotte. – Simon

+0

Per coloro che vengono qui e vogliono un percorso per un'azione in un ApiController: @ Url.HttpRouteUrl ottiene il trucco in questo caso ;-) –

+0

Questo mi ha aiutato a passare la corretta Route a PagedList di Troy Goode. Mi stavo rovinando la testa per quasi un giorno! – Shiva

3

I percorsi sono sensibili agli ordini. Tuttavia, gli attributi non lo sono. Infatti, quando si usano 2 attributi Route su una singola azione come questa, è possibile che funzioni su alcune compilazioni e non su altre perché Reflection non garantisce un ordine quando analizza attributi personalizzati.

Per garantire che i percorsi vengano inseriti nella tabella del percorso nell'ordine corretto, è necessario aggiungere la proprietà Order a ciascun attributo.

[Route("{searchTerm}/page/{page?}", Name = "NamedSearch", Order = 1)] 
[Route("~/add", Order = 2)] 
public ActionResult Index(string searchTerm = "", int page = 1) 
{ 
    return View(); 
} 

Dopo aver risolto il problema di ordinamento, l'URL risolve il modo in cui ci si aspetta.

@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1 }) 

// Returns "/add/replaceMe/page/1" 
+0

Grazie, ho trovato che questo ha risolto la rotta 'NamedSearch' ma ha rotto la rotta di base (ordine = 2) se avessi usato @ Html.ActionLink ("Aggiungi problemi", "Indice", nuovo {controller = "Cerca"}). L'unico modo affidabile per farlo funzionare era aggiungere nomi a entrambi. – Simon

0

Per tornare uso URL completo questo

@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1}, protocol: Request.Url.Scheme) 

// Returns "http://yourdomain.com/add/replaceMe/page/1" 

Spero che questo aiuti qualcuno.