Costruisci l’URL in vista per Web Api con il routing degli attributi

Come posso ottenere l’url dalla web api a mio avviso?

Esempio (dal msdn-blog ):

[RoutePrefix("reviews")] public class ReviewsController : ApiController { // eg.: /reviews [Route] public IHttpActionResult Get() { ... } // eg.: /reviews/5 [Route("{reviewId}")] public IHttpActionResult Show(int reviewId) { ... } // eg.: /reviews/5/edit [Route("{reviewId}/edit")] public IHttpActionResult Edit(int reviewId) { ... } } 

Ora voglio build “/ reviews / edit” secondo me, come posso fare questo?

Ho provato a creare un piccolo metodo di estensione, ma mi impone di assegnare a ogni percorso un “NomeRotta” effettivo. C’è un metodo che posso usare (come in MVC) dove posso semplicemente passare il controller e l’azione?

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

Anche il metodo che sto usando ora (con RouteName) non mi permette di usare numeri interi come parametri (a meno che non passi un valore predefinito). Se devo nominare tutti i miei percorsi, come posso creare un URL di rotta, ma passare i miei parametri nella sezione “dati” della mia richiesta?

Metodo attuale:

 public static string ResolveWebApiRoute(this UrlHelper urlHelper, string routeName, object routeValues = null) { var newRouteValues = new RouteValueDictionary(routeValues); newRouteValues.Add("httproute", true); return urlHelper.RouteUrl(routeName, newRouteValues); } 

MODIFICARE

Quando ho usato metodi come Url.RouteUrl(new { controller = ..., action = ...}) , Reindirizza direttamente a tale azione (ad esempio new { controller = "Reviews", action = "Show"} --> /reviews/show , più voglio che reindirizzi a /reviews/...

La generazione di collegamenti alle rotte dell’API Web richiede sempre un RouteName , quindi dovresti avere qualcosa di simile qui sotto:

 [Route("{reviewId}/edit", Name="EditView")] public IHttpActionResult Edit(int reviewId) { ... } 

È quindi ansible generare un collegamento come /reviews/1/edit all’API Web.

 Url.RouteUrl(routeName: "EditView", routeValues: new { httpRoute = true, reviewId = 1 }); 

o

 Url.HttpRouteUrl(routeName: "EditView", routeValues: , reviewId = 1) 

Si noti che i nomi delle rotte devono essere specificati esplicitamente e non vengono più generati automaticamente come suggerisce @Karhgath. Questa è stata una modifica apportata dalla versione RC alla versione RTM.

Quando si utilizzavano gli attributi del percorso, ero in grado di ottenere il percorso di un controller WebApi2 da una vista MVC usando qualcosa di simile a questo:

 Url.HttpRouteUrl("RouteName", new { }) 

In WebApi2 quando si utilizza AttributeRouting , i nomi di percorso sono denominati per impostazione predefinita Controller.Action , ma è ansible specificare anche un nome RouteName :

 [RoutePrefix("reviews")] public class ReviewsController : Controller { // The route name is defaulted to "Reviews.Index" [Route] public ActionResult Index() { ... } // The route name is "ShowReviewById" [Route("{reviewId}"), RouteName("ShowReviewById")] public ActionResult Show(int reviewId) { ... } // The route name is by default "Reviews.Edit" [Route("{reviewId}/edit")] public ActionResult Edit(int reviewId) { ... } 

Quindi per chiamarlo nella vista è necessario solo impostare il nome della rotta e inviare i parametri come object anonimo:

 // Outputs: /reviews/123 @Url.Action("ShowReviewById", new { reviewId = 123 }) // Outputs: /reviews/123/edit @Url.Action("Reviews.Edit", new { reviewId = 123 })