2014-01-17 41 views
9

如何從我的視圖中的web api獲取url?爲屬性路由的Web Api構建url 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) { ... } 
} 

現在我想建立在我看來, 「/評論/編輯」,我該怎麼辦呢?

我試着創建一個小擴展方法,但它需要我給每個路由一個實際的「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 = ...}),它直接重定向到行動(如new { controller = "Reviews", action = "Show"} --> /reviews/show,whilest我希望它重定向到/reviews/...

+0

看起來有些混亂......你想生成一個鏈接到MVC操作和NOT Web API。 'httproute'用於生成指向Web API控制器的鏈接,而不是您的情況。 –

+0

這是一個錯誤的複製/粘貼,它絕對是一個Web API控制器,而不是一個MVC控制器,謝謝指出 –

回答

21

生成鏈接到網頁API的路線總是需要一個RouteName,所以你應該有類似下面的東西:

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

然後,您可以生成像/reviews/1/edit對Web API的鏈接。

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

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

注意,路線名稱必須顯式地指定他們不再自動生成像什麼@Karhgath是在暗示。這是從RC到RTM版本的變化。

+3

因此,如果我不知道該Id,我需要做什麼(我想用它作爲JavaScript中的參數)? –

+0

@Kiran,你確定這是唯一的方法嗎? ..如果是的話,我怎樣才能避免重複的路線名稱? –

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 }) 
+0

看到我的編輯更多信息^^ –

+0

嗯,我認爲從上面很清楚,但我更新包含編輯路線示例的答案。如果不明確,我想從您那裏獲取更多信息。 – Karhgath

+0

是的,我搞砸了這個例子(我認爲這是一個API控制器,但我複製了一個MVC的例子)。我的問題仍然存在,我怎樣才能在Web API中獲得Url? –

3

當使用路由屬性,我能夠使用像這樣從MVC觀統領WebApi2控制器的路線:

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