2012-06-11 54 views
3

我的網站主要是一套通過Asp.Net Web API公開的Web服務。還有一些頁面,旨在支持Web服務(測試等),用Razor編寫(並隱式地使用Asp.Net MVC 4)。Html.RouteLink到Web API路由 - 可能嗎?

對於XML版本的Web服務,我有一個模式導出操作(使用XsdDataContractExporter),它是由我的標準API路徑拾取的(儘管注意 - 我翻轉了Web API和Pages的優先級):

//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的HtmlHelperUrlHelper根本不想拿起Web API路由。

我敢肯定,如果我打開Asp.Net MVC 4的源代碼,我會找到原因 - 但我希望有人已經知道,並且因爲我無法找到另一個關於這種交叉鏈接的SO我認爲這是對SO庫的一個很好的補充。

我應該添加瀏覽到~/Schema~/Schema.xsd是否正確顯示由API操作產生的X​​ML模式。

回答

5

更新

後RC加入MVC的UrlHelperHttpRouteUrl,這不正是我建議在這裏這個答案同樣的事情的方法。 This is my discussion thread over on CodePlex我被告知這個。因此,您無需在此處使用魔術字符串來生成指向Web API路由的鏈接。

原來的答覆

我已經成功地得到它的工作 - 雖然它可能不是由時間MVC 4 RTMd

我改變了我的電話Html.RouteLink如(免責聲明!)如下:

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

我最初沒有打算回答我的問題,立竿見影 - 但已經做了一些研究,我找到了答案。

首先我驗證了HtmlHelper的路線集合與RouteTable.Routes集合(即包含所有路線)相同。

在通過調用鏈之後,我記得從CodePlex中瀏覽了當前的Web API和頁面MVC 4源代碼,HttpRoute(需要System.Web.Http.Routing)需要添加一個「隱藏」路由值,否則它們將永遠不會比賽。下面是從線HttpRoute類(正確的,因爲2012年6月8日源)的21-25的源代碼:

/// <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上有額外的擴展名用於隱藏路徑數據值的魔術字符串。