我目前有一个带有CRUD操作的基本ASP.NET Core后端(使用EF Core)。我想现在添加一个搜索请求,它从前端接收一个字符串,并查找与该字符串匹配的数据。
但我发现this article already,因为我必须创建一个HttpGet
请求,我无法让路由工作。
这是我对单个模型的获取请求的样子
// GET: api/JoeTests/5
[HttpGet("{id}")]
public async Task<IActionResult> GetJoeTest([FromRoute] int id)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var joeTest = await _context.JoeTest.SingleOrDefaultAsync(m => m.Id == id);
if (joeTest == null)
{
return NotFound();
}
return Ok(joeTest);
}
创建另一个获取请求,如
[HttpGet("{string}")]
不会工作。它将始终跳转到GetID请求。如果我对此搜索请求使用不同的RoutePrefix
而不是 api / JoeTests / ,我可以解决这个问题,但是,有没有办法区分前端究竟想要的是什么?
[Produces("application/json")]
[Route("api/JoeTests")]
public class JoeTestsController : Controller
{
private readonly CustomerDBContext _context;
public JoeTestsController(CustomerDBContext context)
{
_context = context;
}
}
这些是我定义 base?路径
的行答案 0 :(得分:0)
您可以使用route constraints实现所需目标:
[Produces("application/json")]
[Route("api/JoeTests")]
public class JoeTestsController : Controller
{
// the :int restricts the route to integers
[HttpGet("{id:int}")]
public async Task<IActionResult> GetJoeTest([FromRoute] int id)
{
}
// the route will match anything except integers
[HttpGet("{str}")]
public async Task<IActionResult> GetJoeTest([FromRoute] string str)
{
}
}
也可以更改每种方法的路线:
[Produces("application/json")]
[Route("api/JoeTests")]
public class JoeTestsController : Controller
{
// route is now api/JoeTests/byid/5
[HttpGet("byid/{id:int}")]
public async Task<IActionResult> GetJoeTest([FromRoute] int id)
{
}
// route is now api/JoeTests/bystr/whatever
[HttpGet("bystr/{str}")]
public async Task<IActionResult> GetJoeTest([FromRoute] string str)
{
}
}