ASP.NET Web API URLを作成する方法


回答:


139

ApiControllerはと呼ばれる性質があるのUrl型であるSystem.Web.Http.Routing.UrlHelperあなたはAPIコントローラのURLを作成することができます。

例:

public class ValuesController : ApiController
{
    // GET /api/values
    public IEnumerable<string> Get()
    {
        // returns /api/values/123
        string url = Url.Route("DefaultApi", new { controller = "values", id = "123" });
        return new string[] { "value1", "value2" };
    }

    // GET /api/values/5
    public string Get(int id)
    {
        return "value";
    }

    ...
}

このUrlHelperは、ビューにも標準コントローラーにも存在しません。


更新:

ApiControllerの外部でルーティングを行うには、次のようにします。

public class HomeController : Controller
{
    public ActionResult Index()
    {
        string url = Url.RouteUrl(
            "DefaultApi", 
            new { httproute = "", controller = "values", id = "123" }
        );
        return View();
    }
}

またはビュー内:

<script type="text/javascript">
    var url = '@Url.RouteUrl("DefaultApi", new { httproute = "", controller = "values", id = "123" })';
    $.ajax({
       url: url,
       type: 'GET',
       success: function(result) {
           // ...
       }
    });
</script>

httproute = ""重要なルートトークンに注意してください。

明らかにこれは、ApiルートがのDefaultApiRegisterRoutesメソッドで呼び出されることを前提としていますGlobal.asax

routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

安全な方法でURLを生成できるようにビューを設定する必要があるため、これは本当に役に立ちません。Go Liveライセンスがある場合、ビューにURLを作成する「Go Live」方法は何ですか?
シェーンコートリル

さらに重要なのは、ASP.Net Development Serverを使用している場合、ポートが常に変更されるためビューでURLをハードコアすることさえできないため、これは機能しません。
シェーンコートリル

@ShaneCourtrille、私の回答を更新して、通常の方法でSystem.Web.Mvc.UrlHelperHttpControllerContextの外部にAPI ルートを生成する方法を説明しました。
Darin Dimitrov

どうもありがとう!RouteUrlを使用しようとしましたが、httproute param要件について知りませんでした。
シェーンコートリル

2
サンプルの目的を理解しています。この値は、可能性のあるシナリオで取得しようとしているものであり、任意のコードを実行するだけではないことを示しているため、ViewBagコードの1行を投入した場合、より有用なサンプルになると言っています。繰り返しますが、特定のコード行が関連するものであることを最終的に認識する前に、私が見逃したことに気付かずに数分間無駄にならなかったとしたら、コメントしませんでした。
Jon Davis

43

より簡単な形式で機能するUrl.Actionため、ルーティング名を参照する必要はありません。

Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" })

area = ""エリア内でURLが必要な場合は、を追加することができます。(ApiコントローラーはデフォルトでAreasの外にあります。)私はMVC 4を使用しています。


7
Web APIのUrlHelperはmsdn.microsoft.com/en-us/library/…です。アクションメソッドはありません。
Yuriy Faktorovich 2013

8
@YuriyFaktorovichこの投稿Url.Actionは、ビューから使用されていることを意味します。UrlはタイプSystem.Web.Mvc.UrlHelperであり、WebApiルートにマッピングされません。これが、追加のパラメーターが必要な理由ですnew { httproute = "" }
ジェシー

3
追加しましたhttproute""が、マッピングされません= /
Maslow

空白の領域とnullのhtmlAttributesを含むリンクを追加する必要@Html.ActionLink("link", "Get", "Servers", new { id = r.idServer, area = "", httproute = "" }, null) がありましたが、それは完全に機能しました
Christopher G. Lewis

2
これはビューから完全に機能しますが、アクションの名前が/ api / dashboard?action = getdataのようなクエリ文字列として生成される理由はわかりません。私はこれを予期していました:/ api / dashboard /
getdata

7

ハードコードされた文字列(コントローラ名)なしでタイプセーフな方法でリンクを生成できるようにしたいですか?

そのための核心があります!(そしてそれはマーク・シーマンによって書かれました)

https://github.com/ploeh/Hyprlinkr

このように動作します:

通常通りのルート:

name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }

URLを取得します。

var linker = new RouteLinker(request);
var uri = linker.GetUri<FooController>(r => r.GetById(1337));

結果:

http://localhost/api/foo/1337

3

質問に答えるためのKISSメソッドは次のとおりです。

これがMVCコントローラーURLの作成に使用するコードである場合

@Url.Action("Edit", "MyController")

コントローラのAPIバージョンのURLを取得するために(同じコントローラ名を使用する場合)、以下を使用できます。

@Url.Action("Edit", "api/MyController")

Url.Actionメソッドが実行しているのは、アプリケーションのルートパスにコントローラー名を追加し、その後にアクション名を追加したものです(「インデックス」でない場合は追加されません。ルート値オブジェクトにIDがある場合)プロパティ値もURLに追加されます。


ありがとうございました!api/以前のコントローラー名がありませんでした。
Daniel Congrove
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.