3

私のサイトは主に、Asp.NetWebAPIを介して公開される一連のWebサービスです。Razor(および暗黙的にAsp.Net MVC 4)で記述されたWebサービス(テストなど)をサポートするように設計されたページもあります。

WebサービスのXMLバージョンの場合XsdDataContractExporter、標準のAPIルートによって取得されるスキーマエクスポートアクション(を使用)があります(ただし、Web APIとページの優先順位を反転しました)。

//page routes
routes.MapRoute(
    "Default", // Route name
    "pages/{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", 
          action = "Index", 
          id = UrlParameter.Optional 
        } // Parameter defaults
);

//an additional route for my Schema controller action
routes.MapHttpRoute("XSD", "schema.xsd",
    new { controller = "schema" });

//API Catch-all Route
routes.MapHttpRoute("APIMain", "{controller}/{id}",
    new { id = RouteParameter.Optional });

かみそりのページで、「わかりやすい」スキーマURLへのリンクを出力したいと思います~/Schema.xsd。ルート検出の問題を予測して、私はすぐに名前で直接ルートにアクセスしました。

@Html.RouteLink("Schema", "XSD");

ただし、これは。と同等のリンクを発行するだけ~/です。

ルート値の他の組み合わせをいくつか試しましたが、MVCのように見え、WebAPIルートHtmlHelperUrlHelper取得したくないだけです。

Asp.Net MVC 4のソースをクラックして開いた場合、その理由はわかると思いますが、誰かがすでに知っていることを望んでいます。そのようなクロスリンクについて別のSOが見つからないため、私はそれを理解しました。 dはSOライブラリへの良い追加です。

そのブラウジングを追加して、APIアクションによって生成されたXMLスキーマを正しく表示する必要が~/Schemaあります。~/Schema.xsd

4

1 に答える 1

5

アップデート

ポストRCメソッドがMVCに追加されましたUrlHelperHttpRouteUrlこれは、この回答でここで提案するのとまったく同じことを行います。 これは、私がこれを言われたCodePlexに関する私のディスカッションスレッド です。したがって、Web APIルートへのリンクを生成する際に、ここで説明したマジックストリングを使用する必要はありません。

元の回答

私はそれをうまく機能させることができました-MVC4がRTMdになるまでにはそうではないかもしれませんが(免責事項免責事項!)

Html.RouteLink呼び出しを次のように変更しました。

@Html.RouteLink("XML request schema", "XSD", new { httproute = true })

私はもともと自分の質問にすぐに答えるつもりはありませんでしたが、いくつかの調査を行った結果、答えが見つかりました。

最初に、HtmlHelperのルートコレクションがコレクションと同じであることRouteTable.Routes(つまり、すべてのルートが含まれていること)を確認しました。

コールチェーンスルーに続いて、CodePlexから現在のWebAPIとページMVC4ソースコードをトロールしたことを思い出しHttpRouteましSystem.Web.Http.Routingた。追加するには「非表示」ルート値が必要です。そうしないと、一致しません。クラスの21〜25行目のソースコードはHttpRoute次のとおりです(2012年6月8日のソースの時点で正しい):

/// <summary>
/// Key used to signify that a route URL generation request should include HTTP routes (e.g. Web API).
/// If this key is not specified then no HTTP routes will match.
/// </summary>
internal const string HttpRouteKey = "httproute";

コードを少し詳しく分析すると、このルート値がブール値であることが期待されていることがわかりました。

明らかに、これは拡張メソッド(おそらくHtml.HttpRouteLink(および))に変換できるものであり、ルートデータ値のマジックストリングを非表示にするためのHtml.HttpActionLink追加の拡張がオンになっています。UrlHelper

于 2012-06-11T09:03:25.307 に答える