Asp. NET Основной пользовательский маршрут не работает с веб-API 2.1 - PullRequest
0 голосов
/ 11 апреля 2020

Я новичок в ASP. NET Core Web API и пытаюсь реализовать собственный маршрут. Вот мой контроллер:

using ...

namespace FoodDeliveryServer.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class MenusController : ControllerBase
{
    private readonly FoodDeliveryContext _context;

    public MenusController(FoodDeliveryContext context)
    {
        _context = context;
    }

    // GET: api/Menus
    [HttpGet]
    public IEnumerable<Menu> GetMenu_1()
    {
        return _context.Menu;
    }

    // rest of the methods

    // POST: api/Menus
    [HttpPost]
    public async Task<IActionResult> PostMenu([FromBody] Menu menu)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        _context.Menu.Add(menu);
        await _context.SaveChangesAsync();

        return CreatedAtAction("GetMenu", new { id = menu.Id }, menu);
    }

    // POST: api/Menus/filter
    [HttpPost("filter", Name = "Filtermenu")]
    public async Task<IActionResult> FilterMenu([FromBody] bool isActive)
    {
        return Ok(_context.Menu.Where(m => m.IsActive == isActive));
    }

    private bool MenuExists(long id)
    {
        return _context.Menu.Any(e => e.Id == id);
    }
}
}

Теперь я пытаюсь пройти маршрут filter из POSTMAN и получить 404. Другие стандартные маршруты работают нормально.

POST
http://localhost:5000/api/Menus/filter

Body -> raw -> JSON

{
    "isActive": true
}

Headers -> Accept -> application/json
Headers -> Content-Type -> application/json

Что я здесь не так делаю?

Я тоже посмотрел эту ссылку, но все еще возникают проблемы:

ASP. Net Не работает пользовательский маршрут Core Web API.

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

Вы также можете использовать декоратор [Route("")] в своих действиях. В противном случае он создаст маршруты на основе того, что вы определили в StartUp.Configure.

// POST: api/Menus/filter
[Route("filter")]
[HttpPost("filter", Name = "Filtermenu")]
public async Task<IActionResult> FilterMenu([FromBody] bool isActive)
{
    return Ok(_context.Menu.Where(m => m.IsActive == isActive));
}

Должно работать для вас. Часть '/ api / Menus /' будет унаследована от вашего [Route("api/[controller]")] определения на уровне контроллера

0 голосов
/ 11 апреля 2020

Я решил проблему с помощью @Marius. Вот что я сделал:

    // POST: api/Menus/filter
    [HttpPost]
    [Route("filter", Name = "Filtermenu")]
    public async Task<IActionResult> FilterMenu([FromBody] Menu menu)
    {
        return Ok(_context.Menu.Where(m => m.IsActive == menu.IsActive));
    }

Похоже, нам нужно предоставить класс для чтения FromBody

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...