2012-02-29 10 views

risposta

123

Il ApiController ha una proprietà denominata Url che è di tipo System.Web.Http.Routing.UrlHelper che consente di creare URL per i controller API.

Esempio:

public class ValuesController : ApiController 
{ 
    // GET /api/values 
    public IEnumerable<string> Get() 
    { 
     // returns /api/values/123 
     string url = Url.Route("DefaultApi", new { controller = "values", id = "123" }); 
     return new string[] { "value1", "value2" }; 
    } 

    // GET /api/values/5 
    public string Get(int id) 
    { 
     return "value"; 
    } 

    ... 
} 

Questa UrlHelper non esiste né in vostro punto di vista, né nei controllori standard.


UPDATE:

E per fare fuori il routing di un ApiController si potrebbe procedere come segue:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     string url = Url.RouteUrl(
      "DefaultApi", 
      new { httproute = "", controller = "values", id = "123" } 
     ); 
     return View(); 
    } 
} 

o all'interno di una vista:

<script type="text/javascript"> 
    var url = '@Url.RouteUrl("DefaultApi", new { httproute = "", controller = "values", id = "123" })'; 
    $.ajax({ 
     url: url, 
     type: 'GET', 
     success: function(result) { 
      // ... 
     } 
    }); 
</script> 

Avviso del httproute = "" token di rotta che è importante.

Ovviamente questo presuppone che il percorso Api si chiama DefaultApi nel metodo RegisterRoutes in Global.asax:

routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 
+0

Che .. davvero non mi aiuta molto dal momento che ho bisogno della mia vista per essere in grado di generare URL in modo sicuro. Se esiste una licenza Go Live, qual è il modo "Go Live" per creare URL nella vista? –

+0

Ancora più importante, questo non funzionerà se utilizzi ASP.Net Development Server poiché cambia le porte continuamente, quindi non puoi nemmeno aggiungere l'URL nella vista. –

+0

@ShaneCourtrille, ho aggiornato la mia risposta per illustrare come utilizzare il normale 'System.Web.Mvc.UrlHelper' per generare percorsi Api al di fuori di un HttpControllerContext. –

41

Funziona con la forma più semplice di Url.Action quindi non devi fare riferimento a tutti i nomi di routing:

Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" }) 

È possibile aggiungere un area = "" se l'URL è necessario all'interno di un'area. (I controller Api sono al di fuori delle aree per impostazione predefinita.) Sto utilizzando MVC 4.

+7

UrlHelper in Web Api è http: // msdn.microsoft.com/en-us/library/system.web.http.routing.urlhelper(v=vs.108).aspx, non ha un metodo di azione. –

+6

@YuriyFaktorovich Questo post implica che 'Url.Action' viene utilizzato da una vista. 'Url' è di tipo' System.Web.Mvc.UrlHelper', e non si associa alle rotte 'WebApi'. Questo è il motivo per cui hai bisogno del parametro extra: 'new {httproute =" "}'. – Jesse

+3

Ho aggiunto 'httproute" "' ma non sta mappando =/ – Maslow

4

Vuoi essere in grado di generare collegamenti in modo typesable, senza stringhe codificate (nomi controller)?

C'è un nuget per questo!(Ed è scritto da Mark Seeman)

https://github.com/ploeh/Hyprlinkr

funziona così:

Routes, come al solito:

name: "API Default", 
routeTemplate: "api/{controller}/{id}", 
defaults: new { id = RouteParameter.Optional } 

ottenere un URL:

var linker = new RouteLinker(request); 
var uri = linker.GetUri<FooController>(r => r.GetById(1337)); 

Risultato:

http://localhost/api/foo/1337 
0

Ecco il metodo Kiss per rispondere alla domanda:

Se questo è il codice che si usa per creare un controller URL MVC

@Url.Action("Edit", "MyController") 

Al fine di ottenere un URL per le API versione del controller (supponendo che si utilizza lo stesso nome del controller) è possibile utilizzare

@Url.Action("Edit", "api/MyController") 

Tutto il metodo Url.Action sta facendo è aggiungendo il percorso principale dell'applicazione, con la c nome ontroller, seguito dal nome dell'azione (a meno che non sia "Index", nel qual caso non viene aggiunto. se l'oggetto dei valori di percorso ha una proprietà id, anche il valore viene aggiunto all'URL.