【发布时间】:2017-11-03 14:47:19
【问题描述】:
如果我在 API 调用中调用 UrlHelper.Link,该调用的参数与我试图为其获取 URL 的 API 端点的可选参数匹配,UrlHelper.Link 无论如何都会返回一个带有当前请求值的 URL我尝试从链接中排除可选参数。
例如
[HttpGet]
[Route("api/Test/Stuff/{id}")]
public async Task<IHttpActionResult> GetStuff(int id) // id = 78
{
string link = Url.Link("Mary", new
{
first = "Hello",
second = "World"
});
string link2 = Url.Link("Mary", new
{
first = "Hello",
second = "World",
id = (int?)null
});
string link3 = Url.Link("Mary", new
{
first = "Hello",
second = "World",
id = ""
});
return Ok(new
{
link,
link2,
link3
});
}
[HttpGet]
[Route("api/Test/Another/{first}", Name = "Mary")]
public async Task<IHttpActionResult> AnotherMethod(
[FromUri]string first,
[FromUri]string second = null,
[FromUri]int? id = null)
{
// Stuff
return Ok();
}
获取http://localhost:53172/api/Test/Stuff/8
返回
{
"link": "http://localhost:53172/api/Test/Another/Hello?second=World",
"link2": "http://localhost:53172/api/Test/Another/Hello?second=World&id=8",
"link3": "http://localhost:53172/api/Test/Another/Hello?second=World&id=8"
}
当 Url.Link 未呈现或分配给 null 或空字符串时,如何让 Url.Link 实际使用您传递给它的值,而不是从当前 api 请求中提取它?
我认为这个问题与 .... 非常相似。
UrlHelper.Action includes undesired additional parameters
但这是 Web API 而不是 MVC,不是一个动作,而且提供的答案似乎并没有为这个问题提供一个明显的解决方案。
编辑:我已经更新了代码,因为原始代码实际上并没有复制问题。我还包含了一个请求 URL 和返回的响应,我已经对其进行了测试。虽然这段代码演示了这个问题,但我试图找到修复的代码不是将匿名类型传递给 UrlHelper,而是它是一个生成时间戳和散列并具有 4 个可选参数的类。如果有另一个解决方案不需要省略传递给 UrlHelper 的结构中的可选参数,我想拥有它,因为它可以让我免于对代码进行大量更改。
【问题讨论】:
-
同时显示原始网址和链接生成的网址。
-
我建议答案更多的是解决方法。我认为这会引起很多人的注意,他们错误地认为将空值或 null 值分配给传递给 UrlHelper 的任何结构(包括匿名或类类型)上的属性与省略该值相同。虽然这种行为实际上可能是设计使然,但我认为这是非常错误的设想,而不是您所期望的
标签: .net asp.net-web-api owin