簡體   English   中英

使用屬性路由為Web Api構建URL視圖

[英]Construct url in view for Web Api with attribute routing

如何在我看來從web 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)也不允許我使用整數作為參數(除非我傳遞一個默認值)。 如果我確實需要命名我的所有路由,我如何創建路由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 })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM