UrlHelper.Link返回不需要的参数

时间:2017-06-02 08:54:23

标签: .net asp.net-web-api owin

如果我在API调用中调用UrlHelper.Link,该调用的参数与API端点的可选参数相匹配,我尝试获取其URL,UrlHelper.Link会返回一个包含当前请求值的网址我是如何尝试从链接中排除可选参数的。

e.g。

[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,而不是一个动作,并且提供的答案似乎没有为这个问题提供明显的解决方案。

编辑:我已更新了代码,因为原始代码并未实际复制该问题。我还提供了一个请求网址,并返回了我已经测试过的响应。虽然此代码演示了此问题,但我尝试查找修复程序的代码并未将匿名类型传递给UrlHelper,而是将其生成时间戳和哈希并具有4个可选参数的类。如果有另一个解决方案并不需要在传递给UrlHelper的结构中省略可选参数,我希望能够拥有它,因为它可以避免我对其进行大量更改代码。

1 个答案:

答案 0 :(得分:3)

传递路线值时不要包含id。实际上它不应该允许你编译为

  

无法将<null>分配给匿名类型属性

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未包含在生成的链接中。