如何从一个控制器向另一个控制器添加项目?

时间:2018-11-16 06:37:08

标签: asp.net asp.net-web-api asp.net-core

我正在学习ASP.NET mvc,因此我扩展了Todo列表教程,因此可以将其用作购物车类的基础。我不知道使用哪个URL来调用Cart控制器的Add方法。

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 :(得分:0)

您的add方法应类似于以下内容,以便您检查是否已经有商品,如果没有,请返回Conflict HTTP状态码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”的路线