Html.RouteLink到Web API路由 - 可能吗?

时间:2012-06-11 08:37:35

标签: asp.net asp.net-mvc asp.net-mvc-4 asp.net-web-api

我的网站主要是通过Asp.Net Web API公开的一套Web服务。还有一些页面,旨在支持使用Razor(以及隐式的Asp.Net MVC 4)编写的Web服务(测试等)。

对于webservices的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的HtmlHelperUrlHelper根本就不想选择Web API路线。< / p>

我确定如果我破解了Asp.Net MVC 4的来源我找不到原因 - 但我希望有人已经知道,因为我无法找到关于这种交联的另一个问题,我认为它是SO库的一个很好的补充。

我应该补充一点,浏览到~/Schema~/Schema.xsd会正确显示API操作生成的XML架构。

1 个答案:

答案 0 :(得分:5)

更新

Post-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 s(在System.Web.Http.Routing中)需要一个'隐藏'的路由值否则他们永远不会匹配。以下是HttpRoute类第21-25行的源代码(截至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上有额外的扩展名,用于隐藏路由数据值的魔术字符串