Asp.net Html.RouteLink到Web API路由-可能吗?
我的网站主要是一套通过Asp.NETWebAPI公开的web服务。还有一些页面,设计用于支持Web服务(测试等),是用Razor编写的(隐式的是Asp.NETMVC4) 对于Web服务的XML版本,我有一个模式导出操作(使用Asp.net Html.RouteLink到Web API路由-可能吗?,asp.net,asp.net-mvc,asp.net-mvc-4,asp.net-web-api,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Asp.net Web Api,我的网站主要是一套通过Asp.NETWebAPI公开的web服务。还有一些页面,设计用于支持Web服务(测试等),是用Razor编写的(隐式的是Asp.NETMVC4) 对于Web服务的XML版本,我有一个模式导出操作(使用XsdDataContractExporter),它由我的标准API路由选择(尽管注意-我已经翻转了Web API和页面的优先级): 现在,在razor页面上,我想发出一个指向“友好”模式URL的链接~/schema.xsd。由于预见到路线发现的问题,我立即直呼路线名称: @
XsdDataContractExporter
),它由我的标准API路由选择(尽管注意-我已经翻转了Web API和页面的优先级):
现在,在razor页面上,我想发出一个指向“友好”模式URL的链接~/schema.xsd
。由于预见到路线发现的问题,我立即直呼路线名称:
@Html.RouteLink("Schema", "XSD");
但是,这只会发出一个相当于~/
的链接
我尝试了一些路由值的其他组合-但看起来MVC的HtmlHelper
和UrlHelper
根本不想选择Web API路由
我相信,如果我打开Asp.NETMVC4的源代码,我会找到原因的——但我希望有人已经知道,因为我找不到关于这种交叉链接的另一个SO,所以我认为它将是SO库的一个很好的补充
我应该将浏览添加到~/Schema
和~/Schema.xsd
中,以正确显示API操作生成的XML模式。更新
在MVC的UrlHelper
,HttpRouteUrl
中添加了一个方法,它的作用与我在这里的回答中建议的完全相同。在那里我被告知这件事。因此,在生成指向Web API路由的链接时,您不需要使用这里提到的神奇字符串
原始答案
我已经设法让它工作了——尽管在MVC4成为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日正确源代码):
//
///用于表示路由URL生成请求应包括HTTP路由(例如Web API)的键。
///如果未指定此密钥,则没有匹配的HTTP路由。
///
内部常量字符串HttpRouteKey=“httproute”;
对代码的进一步分析表明,它希望这个路由值是一个布尔值
显然,这是一种可以转化为扩展方法的方法-可能是Html.HttpRouteLink
(和Html.HttpActionLink
)-在UrlHelper
上有额外的扩展,用于隐藏路由数据值的神奇字符串
@Html.RouteLink("XML request schema", "XSD", new { httproute = true })
/// <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";