Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net Html.RouteLink到Web API路由-可能吗?_Asp.net_Asp.net Mvc_Asp.net Mvc 4_Asp.net Web Api - Fatal编程技术网

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

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。由于预见到路线发现的问题,我立即直呼路线名称: @

我的网站主要是一套通过Asp.NETWebAPI公开的web服务。还有一些页面,设计用于支持Web服务(测试等),是用Razor编写的(隐式的是Asp.NETMVC4)

对于Web服务的XML版本,我有一个模式导出操作(使用
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";