Вебапи и обычные методы в одном контроллере? - PullRequest
0 голосов
/ 09 ноября 2018

С появлением атрибута Apicontroller в ядре asp.net 2.1 мне интересно, как заставить методы api и normal работать в одном контроллере.

[Route("api/[controller]")]
[ApiController]
public class OrderController : ControllerBase
{
    [HttpPost]
    public async Task<IActionResult> SaveOrder(SaveOrderModel model)
    {
        //...
    }

    public async Task<IActionResult> CustomerOrders()
    {
       if (!User.IsInRole("Customer"))
          return Challenge();
       var customer = await _workContext.CurrentCustomer();

       var model = await orderModelFactory.PrepareCustomerOrderListModel();
       return View(model);
    }
}

Я могу вызвать метод post /api/order/saveorder, но не могу запустить https://example.com/order/customerorders.

Показывает исключения: InvalidOperationException: Action «.CustomerOrders» не имеет атрибута route. Методы действий по контроллеры, аннотированные ApiControllerAttribute, должны быть атрибутом маршрутизация.

Если я удаляю [ApiController] и [Route ("api / [controller]")] на уровне контроллера и вместо этого ставлю на уровень метода, то это, безусловно, работает. до сих пор не знаю, есть ли лучшее гибридное решение для этих методов, так как я хочу использовать эту новую функцию ApiController.

[Route("/api/controller/saveorder")]
public async Task<IActionResult> SaveOrder(SaveOrderModel model)

Любой вклад приветствуется.

1 Ответ

0 голосов
/ 09 ноября 2018

Вы говорите, что не можете позвонить https://example.com/order/customerorders. В вашем [Route("api/[controller]")] вы определяете, что все методы внутри этого контроллера будут доступны на https://example.com/api/order/.

Итак, чтобы вызвать ваш метод, вам нужно вызвать https://example.com/api/order/customerorders.

Если вы хотите остаться с https://example.com/order/customerorders, вам нужно поставить атрибуты [Route] в ваших методах:

[ApiController]
public class OrderController : ControllerBase
{
        [HttpPost("api/order")]
        public async Task<IActionResult> SaveOrder(SaveOrderModel model)
        {
            ...

        }

        [HttpGet("order/customerorders")]
        public async Task<IActionResult> CustomerOrders()
        {
           if (!User.IsInRole("Customer"))
              return Challenge();
           var customer = await _workContext.CurrentCustomer();

           var model = await orderModelFactory.PrepareCustomerOrderListModel();
           return View(model);
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...