搜索与字符串匹配的数据

时间:2018-02-06 08:56:18

标签: c# asp.net-core routing entity-framework-core

我目前有一个带有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?路径

的行

1 个答案:

答案 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)
    {
    }
}