5

Ho un 2 controller, 1 dei quali è WebAPI:Url.Action con percorsi WebAPI e del controller

public class ListController : ApiController 
{   
    public object Remove(string ListId, List<string> ItemIds) 
    { 
     //removed 
    } 
} 

public class ListController : Controller 
{   
    public object Remove(string ListId, List<string> ItemIds) 
    { 
     //removed 
    } 
} 

miei percorsi sono registrati nel Global.asax come segue:

WebApiConfig.Register(GlobalConfiguration.Configuration); 
RouteConfig.RegisterRoutes(RouteTable.Routes); 

mio percorso WebAPI è definito come:

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{action}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

Quando si genera un URL attraverso @ Url.Action ("Rimuovi", "list"), il percorso di quello che ottiene è '/ list/rimuovere'. Mi aspettavo che il percorso WebApi ('/ api/list/remove') fosse selezionato, poiché le rotte di WebApi erano state registrate prima delle altre rotte.

Come posso ottenere @ Url.Action per restituire il percorso WebApi come previsto?

+0

avete il controller WebAPI nello stesso progetto come il controller non di WebAPI? – DavidG

+0

Sì. Gli spazi dei nomi sono qualcosa.Controllers.WebAPI e qualcosa.Controller – Jason

+1

Hai provato a utilizzare '@ Url.RouteUrl' con il nome della route DefaultApi? – py3r3str

risposta

2
@Url.Action("Remove", "List", new { httproute = "DefaultApi" }) 
+1

Questo funziona per me! – Jamo

0

Per tutti coloro che attraversa questo non funziona come previsto ... Se l'URL viene generato come/List/Rimuovi? Httproute = DefaultApi

Verificare che i percorsi API vengono caricati prima! L'ordine è fondamentale.

Ho anche aggiunti i vincoli per il mio percorso web di configurazione per aiutare escludere percorsi API:

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{action}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
    constraints: new { controller = @"(?!DefaultApi).*" } 
);