2012-06-11 28 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上有额外的扩展名用于隐藏路径数据值的魔术字符串。