2014-01-17 11 views
9

私のビューでWeb APIからURLを取得するにはどうすればよいですか? (msdn-blogから)属性ルーティングを使用してWeb Apiを表示するURLを作成します

例:

[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); 
} 

EDIT

私はUrl.RouteUrl(new { controller = ..., action = ...})のようなメソッドを使用し、それは私はそれが/reviews/...

+0

が見える...あなたはリンクを生成しようとしていますMVCアクションであり、Web APIではありません。 'httproute'はあなたの場合のようにMVCではなくWeb APIコントローラへのリンクを生成するために使われます。 –

+0

これは間違ったコピー/貼り付けでした。間違いなくWeb APIコントローラで、MVCコントローラではありません。 –

答えて

21

ウェブAPIルート常に必要へのリンクを生成:次に

[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) { ... } 

はあなたが唯一のルート名を設定し、匿名オブジェクトとしてパラメータを送信する必要があるビューでそれを呼び出します 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バージョンへの変更でした。

+3

だから私はIdがまだわからない場合は何をする必要がありますか(私はjavascriptのパラメータとして使用したい)? –

+0

@キラン、これが唯一の方法だと確信していますか? ..はいの場合、重複するルート名を避けるにはどうすればよいですか? –

0

にリダイレクトしたいwhilestそのアクション(例えばnew { controller = "Reviews", action = "Show"} --> /reviews/showに直接リダイレクトAttributeRoutingを使用するWebApi2では、ルート名にはデフォルトでController.Actionという名前が付けられていますが、またRouteName

// 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 { })