Url.Link 始终 returns 在 asp..net web api 中使用 null
Url.Link always returns null used within asp..net web api
我想为从 REST 返回的 DTO 创建一些超链接 Api。
变量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)
{
}
路由参数需要匹配路由模板中的预期参数
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) {
}
最后,您应该使用有助于描述路线的正确路线名称。
我花了一段时间才从接受的答案中得到我需要的东西(我的错误与 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)
{
}
我想为从 REST 返回的 DTO 创建一些超链接 Api。
变量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)
{
}
路由参数需要匹配路由模板中的预期参数
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) {
}
最后,您应该使用有助于描述路线的正确路线名称。
我花了一段时间才从接受的答案中得到我需要的东西(我的错误与 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)
{
}