使用属性路由为Web Api构建URL视图
如何在我看来从web api获取url?
示例(来自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) { ... } }
现在我想在我的视图中构建“/ reviews / edit”,我该怎么做?
我已经尝试创建一个小扩展方法,但它要求我给每个路由一个实际的“RouteName”。 有没有我可以使用的方法(比如在MVC中)我可以通过控制器和动作?
@Url.Action("Edit", "Reviews)
我现在使用的方法(使用RouteName)也不允许我使用整数作为参数(除非我传递一个默认值)。 如果我确实需要命名我的所有路线,我如何创建路线url,但是在我的请求的“数据”部分中传递我的参数?
目前的方法:
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); }
编辑
当我使用像Url.RouteUrl(new { controller = ..., action = ...})
这样的方法Url.RouteUrl(new { controller = ..., action = ...})
,它会直接重定向到该动作(例如new { controller = "Reviews", action = "Show"} --> /reviews/show
,我希望它重定向到/reviews/...
生成指向Web API路由的链接始终需要RouteName
,因此您应该具有以下内容:
[Route("{reviewId}/edit", Name="EditView")] public IHttpActionResult Edit(int reviewId) { ... }
然后,您可以生成类似/reviews/1/edit
to Web API的链接。
Url.RouteUrl(routeName: "EditView", routeValues: new { httpRoute = true, reviewId = 1 });
要么
Url.HttpRouteUrl(routeName: "EditView", routeValues: , reviewId = 1)
请注意,需要明确指定路径名称,并且不再像@Karhgath建议的那样自动生成路径名称。 这是从RC到RTM版本的更改。
使用路由属性时,我能够使用以下内容从MVC视图获取WebApi2控制器的路由:
Url.HttpRouteUrl("RouteName", new { })
在WebApi2中使用AttributeRouting时 ,路由名称默认为Controller.Action
命名,但您也可以指定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) { ... }
然后在视图中调用它只需要设置路由名称并将参数作为匿名对象发送:
// Outputs: /reviews/123 @Url.Action("ShowReviewById", new { reviewId = 123 }) // Outputs: /reviews/123/edit @Url.Action("Reviews.Edit", new { reviewId = 123 })