使用属性路由为Web Api构建URL视图

时间:2014-01-17 12:38:29

标签: c# asp.net-mvc asp.net-web-api attributerouting

如何在我看来从网络API获取网址?

示例(来自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)也不允许我使用整数作为参数(除非我传递一个默认值)。如果我确实需要命名我的所有路线,我该如何创建路线网址,但是在我的请求的“数据”部分中传递我的参数?

目前的方法:

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 = ...})等方法时,它会直接重定向到该操作(例如new { controller = "Reviews", action = "Show"} --> /reviews/show,而我希望它重定向到/reviews/...

3 个答案:

答案 0 :(得分:21)

生成指向Web API路由的链接始终需要RouteName,因此您应该具有以下内容:

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

然后,您可以为Web API生成/reviews/1/edit之类的链接。

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

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

请注意,需要明确指定路径名称,并且不再像@Karhgath建议的那样自动生成路径名称。这是从RC到RTM版本的更改。

答案 1 :(得分:4)

使用路由属性时,我能够使用以下内容从MVC视图获取WebApi2控制器的路径:

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

答案 2 :(得分:0)

在使用AttributeRouting时的WebApi2中,路由名称默认为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 })