Как я могу добавить элемент с одного контроллера на другой? - PullRequest
0 голосов
/ 16 ноября 2018

Я изучаю ASP.NET mvc, поэтому я расширил учебник по списку Todo, чтобы использовать его в качестве основы для класса корзины покупок. Я не знаю, какой URL использовать для вызова метода Add контроллера Cart.

namespace TodoApi.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class TodoController : ControllerBase
    {
        public static TodoContext _context;

        public TodoController(TodoContext context)
        {
            _context = context;

            if (_context.TodoItems.Count() == 0)
            {
                // Create a new TodoItem if collection is empty,
                // which means you can't delete all TodoItems.
                _context.TodoItems.Add(new TodoItem { Name = "T-shirt", Price = 5.30 });
                _context.TodoItems.Add(new TodoItem { Name = "Fedora Hat", Price = 7.70 });
                _context.TodoItems.Add(new TodoItem { Name = "Socks", Price = 1.20 });
                _context.SaveChanges();
            }
        }
    }
}

Это класс TodoContext

namespace TodoApi.Models
{
    public class TodoContext : DbContext
    {
        public TodoContext(DbContextOptions<TodoContext> options)
            : base(options)
        {
        }

        public DbSet<TodoItem> TodoItems { get; set; }
    }
}

И модель TodoItem:

namespace TodoApi.Models
{
    public class TodoItem
    {
        public long Id { get; set; }
        public string Name { get; set; }
        public double Price { get; set; }
        public bool IsComplete { get; set; }
    }
}

Это класс ShoppingCartContext:

namespace TodoApi.Models
{
    public class ShoppingCartContext : DbContext
    {
        public ShoppingCartContext(DbContextOptions<TodoContext> options)
            : base(options)
        {
        }

        public DbSet<TodoItem> CartItems { get; set; }
    }
}

Мне нужно вызвать метод Add в контроллере, но я не знаю, какой URL использовать:

namespace TodoApi.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class CartController : ControllerBase
    {
        private readonly ShoppingCartContext _context;

        public CartController(ShoppingCartContext context)
        {
            _context = context;
        }

        [HttpGet]//List all the items in the cart
        public ActionResult<List<TodoItem>> GetAll()
        {
            return _context.CartItems.ToList();
        }

        [HttpPost]
        public IActionResult Add(long id)
        {
            var item = TodoController._context.TodoItems.Find(id);
            System.Console.WriteLine(item.Name + item.Price.ToString());
            _context.CartItems.Add(item);
            _context.SaveChanges();

            return CreatedAtRoute("GetCart", new { id = item.Id }, item);
        }
    }
}

У меня есть некоторый опыт использования Django, но ASP.NET для меня совершенно новый, я совершенно не знаю, как решить эту проблему.

1 Ответ

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

Ваш метод добавления должен выглядеть примерно так, как показано ниже, так что вы проверяете, есть ли у вас уже элемент, если у вас его нет, но возвращаете Conflict HTTP Status Code 409 ... или что-то еще.

    [HttpPost]
    public IActionResult Add(TodoItem model)
    {
        var item = _context.TodoItems.Find(model.Id);
        if (item != null)
        {
            return Conflict();
        }

        _context.CartItems.Add(model);
        _context.SaveChanges();

        return CreatedAtRoute("GetCart", new { id = model.Id }, model);
    }

Я прошел ToDoItem, но я предполагаю, что если вы добавляете корзину для покупок, вам нужно будет это изменить. Но сейчас, если вы оставите его как ToDoItem, вам нужно будет создать POST:

POST: / api / cart Тело:

{
  "id": 0,
  "name": null,
  "price": 0.0,
  "isComplete": false
}

Также эта строка:

CreatedAtRoute("GetCart", new { id = model.Id }, model);

немного неверно, так как у вас нет маршрута с именем «GetCart»

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