【问题标题】:Url.Link always returns null used within asp..net web apiUrl.Link 总是返回在 asp..net web api 中使用的 null
【发布时间】:2017-08-09 18:40:11
【问题描述】:

我想为从 REST Api 返回的 DTO 创建一些超链接。

变量url总是为空,不知道为什么?!

为什么没有创建 url,我还缺少什么?

路由的名称是GetStatusFeedback,这是正确的,我也使用Action和Controller作为路由参数+leadId参数!

public class ValuesController : ApiController
{
    [Route("")]
    [HttpGet]
    public IHttpActionResult Get()
    {
        var leadsFromDataBase = new List<Lead> { new Lead { Id = 1 }, new Lead { Id = 2 } };
        var leadDtos = new List<LeadDto>();
        foreach (var lead in leadsFromDataBase)
        {
            var leadDto = new LeadDto();
            string url = Url.Link("GetStatusFeedback", new { LeadId = lead.Id, Action = "Accept", Controller = "values"});
            leadDto.AcceptLink = new Link { Url = url, Verb = "Get" };


            leadDtos.Add(leadDto);
        }
        return Ok(leadDtos);
    }

    [Route("leads/{id:int}/statusfeedback", Name = "GetStatusFeedback")]
    [HttpPost]
    public void Accept(int leadId)
    {

    }

【问题讨论】:

  • 应该是 Controller = "Values" 而不是 "values"
  • 不,没有帮助!如果那会是问题,我会打 MS 开发人员忽略 string.equals 与 ordinalingore 大小写比较器...

标签: c# asp.net-web-api asp.net-web-api-routing


【解决方案1】:

路由参数需要匹配路由模板中的预期参数

string url = Url.Link("GetStatusFeedback", new { id = lead.Id });

应该基于"leads/{id:int}/statusfeedback"路由模板匹配

路由模板占位符也需要匹配动作中的参数名称

[Route("leads/{id:int}/statusfeedback", Name = "GetStatusFeedback")]
[HttpPost]
public void Accept(int id) {

}

最后,您应该使用有助于描述路线的正确路线名称。

【讨论】:

  • 啊...我陷入了之前发生的那个旧错误:P 就是这样!为了提高代码稳定性,您仍然可以 nameof(Accept) the routeName ;-)
【解决方案2】:

我花了一段时间才从接受的答案中得到我需要的东西(我的错误与 OP 不同),这是基于 Nkosi 的回答和 OP 的评论的简化版本:

public class ValuesController : ApiController
{
  [HttpGet]
  public IHttpActionResult Get()
  {
    string url = Url.Link("GetStatusFeedback", new { Id = 1, Action = "Accept", Controller = "values"});
    /*or*/ url = Url.Link(nameof(Accept), new { Id = 1,      Action = "Accept", Controller = "values"});
    //not  url = Url.Link(nameof(Accept), new { LeadId = 1,  Action = "Accept", Controller = "values"});

    return Ok(url);
  }

// Controller we want to get the URL of:
[HttpPost("leads/{id:int}/statusfeedback", Name = "GetStatusFeedback")]
public void Accept(int id) //param name matches the line above {id} (in OP it mismatched)
{

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多