如果我在 API 调用中调用 UrlHelper.Link,该 API 调用的参数与我尝试获取 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 或空字符串时从当前 api 请求中提取它?
我相信这个问题非常类似于......
UrlHelper.Action includes undesired additional parameters
但这是 Web API 而不是 MVC,不是 Action ,并且提供的答案似乎没有为这个问题产生明显的解决方案。
编辑: 我已经更新了代码,因为原始代码实际上并没有复制这个问题。我还包含了一个请求 URL 和返回的响应,我已经测试过了。虽然这段代码演示了这个问题,但我试图找到修复的代码不是将匿名类型传递给 UrlHelper,而是将它的一个生成时间戳和哈希并具有 4 个可选参数的类。如果有另一个解决方案不需要省略传递给 UrlHelper 的结构中的可选参数,我希望拥有它,因为它可以避免我对代码进行大量更改。
最佳答案
传递路由值时不要包含 id
。事实上,它不应该允许你编译为
public async Task<IHttpActionResult> GetStuff(int id) // id = 78 {
string myUrl = Url.Link(
"Mary",
new
{
first = "Hello World"
});
//...other code
}
使用 web api 2 进行测试,链接到其他操作时不包含
id
。[RoutePrefix("api/urlhelper")]
public class UrlHeplerController : ApiController {
[HttpGet]
[Route("")]
public IHttpActionResult GetStuff(int id) {
string myUrl = Url.Link(
"Mary",
new {
first = "Hello World",
});
return Ok(myUrl);
}
[HttpGet]
[Route(Name = "Mary")]
public IHttpActionResult AnotherMethod(
[FromUri]string first,
[FromUri]string second = null,
[FromUri]int? id = null) {
// Stuff
return Ok();
}
}
打电话
client.GetAsync("/api/urlhelper?id=78")
路由到 GetStuff 操作和生成的链接
"http://localhost/api/urlhelper?first=Hello%20World"
即使在测试时
string myUrl = Url.Link(
"Mary",
new {
first = "Hello World",
id = ""
});
id
未包含在生成的链接中。关于.net - UrlHelper.Link 返回不需要的参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44324712/