In ASP.NET MVC, abbiamo @Url.Action
per le azioni. C'è qualcosa di simile @Url.Api
che potrebbe indirizzare a / api / controller?
In ASP.NET MVC, abbiamo @Url.Action
per le azioni. C'è qualcosa di simile @Url.Api
che potrebbe indirizzare a / api / controller?
Risposte:
L' ApiController ha una proprietà chiamata Url che è di tipo System.Web.Http.Routing.UrlHelper che consente di costruire 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";
}
...
}
Questo UrlHelper non esiste né nelle tue visualizzazioni né nei controller standard.
AGGIORNARE:
E per eseguire il routing al di fuori di un ApiController puoi fare quanto 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>
Notare il httproute = ""
token di rotta che è importante.
Ovviamente questo presuppone che la tua rotta Api sia chiamata DefaultApi
nel tuo metodo RegisterRoutes in Global.asax
:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
System.Web.Mvc.UrlHelper
per generare rotte API al di fuori di un HttpControllerContext.
Funziona con la forma più semplice, Url.Action
quindi non è necessario fare riferimento a nomi di routing:
Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" })
Potresti voler 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 usando MVC 4.
Url.Action
viene utilizzato da una vista. Url
è di tipo System.Web.Mvc.UrlHelper
e non è associato a WebApi
percorsi. Questo è il motivo per cui è necessario il parametro in più: new { httproute = "" }
.
httproute""
ma non è mappatura = /
@Html.ActionLink("link", "Get", "Servers", new { id = r.idServer, area = "", httproute = "" }, null)
ma ha funzionato perfettamente
Vuoi essere in grado di generare collegamenti in modo sicuro, senza stringhe hardcoded (nomi di controller)?
C'è una pepita per questo! (ed è scritto da Mark Seeman)
https://github.com/ploeh/Hyprlinkr
Funziona così:
Itinerari, come al solito:
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
Ottieni un URL:
var linker = new RouteLinker(request);
var uri = linker.GetUri<FooController>(r => r.GetById(1337));
Risultato:
http://localhost/api/foo/1337
Ecco il metodo KISS per rispondere alla domanda:
Se questo è il codice che useresti per creare un URL del controller MVC
@Url.Action("Edit", "MyController")
Per ottenere un URL per la versione API del controller (supponendo che tu usi lo stesso nome del controller) puoi usare
@Url.Action("Edit", "api/MyController")
Tutto ciò che il metodo Url.Action sta facendo è aggiungere il percorso root dell'applicazione, con il nome del controller, seguito dal nome dell'azione (a meno che non sia "Index", nel qual caso non viene aggiunto. Se l'oggetto dei valori di route ha un id proprietà il valore viene aggiunto anche all'URL.
api/
prima il nome del mio controller.