在 Web API 控制器中添加指向资源表示的链接非常容易。使用控制器的Url
属性(属于UrlHelper
类),您可以使用路由名称构建链接的 href,如下所示:
var href = Url.Link("RouteName", new { id = 123 });
的值href
是根据路由配置计算的 - 在这种情况下类似于http://example.org/api/products/123
. 这很棒,因为我可以调整路线配置,而无需更新所有生成 href 的地方。发出的所有链接都符合新配置。
但是这个,或者任何类似的基于路由的技术,可以用来创建模板化的href吗?例如,要使用 HAL 的templated
链接属性创建从某个资源到任意产品的链接:
"_links": {
"self": {
"href": "http://example.org/api/productfinder"
},
"product": {
"href": "http://example.org/api/products/{productId}",
"templated": true
}
}
(我真的没有一个叫做 productfinder 的资源——只是这个问题的一个人为的例子)。
我尝试将routeValues
参数设置为模板的字符串,例如
var href = Url.Link("RouteName", new { id = "{productId}" });
这会产生一个 URL 编码的字符串:http://example.org/api/products/%7BproductId%7D
. 我可以使用.Replace
,但这种方法因另一个原因而失败。如果路由配置具有类型约束,例如{id:int}
,则 href 变为 null。
我尝试将 null 传递给routeValues
希望我可以附加模板部分。 Link()
返回null,所以href
最终只是模板部分。另外,这不适用于复杂的路线,例如api/{this}/something/{that}{?q}
所以我被困住了。我可以使用路由来生成模板化的 href 吗?如果是这样,怎么做?