ASP.NET MVCでは、@Url.Action
forアクションがあります。@Url.Api
/ api / controllerにルーティングするようなものはありますか?
ASP.NET MVCでは、@Url.Action
forアクションがあります。@Url.Api
/ api / controllerにルーティングするようなものはありますか?
回答:
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ルートがのDefaultApi
RegisterRoutesメソッドで呼び出されることを前提としていますGlobal.asax
。
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
System.Web.Mvc.UrlHelper
HttpControllerContextの外部にAPI ルートを生成する方法を説明しました。
より簡単な形式で機能するUrl.Action
ため、ルーティング名を参照する必要はありません。
Url.Action("ActionName", "ControllerName", new { httproute = "DefaultApi" })
area = ""
エリア内でURLが必要な場合は、を追加することができます。(ApiコントローラーはデフォルトでAreasの外にあります。)私はMVC 4を使用しています。
Url.Action
は、ビューから使用されていることを意味します。Url
はタイプSystem.Web.Mvc.UrlHelper
であり、WebApi
ルートにマッピングされません。これが、追加のパラメーターが必要な理由ですnew { httproute = "" }
。
httproute""
が、マッピングされません= /
@Html.ActionLink("link", "Get", "Servers", new { id = r.idServer, area = "", httproute = "" }, null)
がありましたが、それは完全に機能しました
ハードコードされた文字列(コントローラ名)なしでタイプセーフな方法でリンクを生成できるようにしたいですか?
そのための核心があります!(そしてそれはマーク・シーマンによって書かれました)
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
質問に答えるためのKISSメソッドは次のとおりです。
これがMVCコントローラーURLの作成に使用するコードである場合
@Url.Action("Edit", "MyController")
コントローラのAPIバージョンのURLを取得するために(同じコントローラ名を使用する場合)、以下を使用できます。
@Url.Action("Edit", "api/MyController")
Url.Actionメソッドが実行しているのは、アプリケーションのルートパスにコントローラー名を追加し、その後にアクション名を追加したものです(「インデックス」でない場合は追加されません。ルート値オブジェクトにIDがある場合)プロパティ値もURLに追加されます。
api/
以前のコントローラー名がありませんでした。