如果我在 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/

10-10 18:29