122

ASP.NET MVCには@Url.Action、アクションがあります。@Url.Api/ api / controllerにルーティングするようなものはありますか?

4

4 に答える 4

142

ApiControllerには、 System.Web.Http.Routing.UrlHelperタイプのUrlというプロパティがあり、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 = ""重要なルートトークンに注意してください。

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

routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
于 2012-02-29T16:03:57.347 に答える
46

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

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

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

于 2013-07-25T14:41:07.663 に答える
8

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

そのためのナゲットがあります!(そしてそれはMark Seemanによって書かれました)

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
于 2015-11-16T14:43:37.150 に答える
4

質問に答えるためのKISSの方法は次のとおりです。

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

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

コントローラのAPIバージョンのURLを取得するために(同じコントローラ名を使用していると仮定して)、次を使用できます。

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

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

于 2017-10-04T18:13:51.347 に答える