首页 > 解决方案 > 如何将项目从一个控制器添加到另一个控制器?

问题描述

我正在学习 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 对我来说是全新的,我完全不知道如何解决这个问题。

标签: asp.netasp.net-web-apiasp.net-core

解决方案


您的 add 方法应如下所示,以便您检查是否已经有项目,如果有,则不添加,但返回ConflictHTTP 状态代码 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:

发布:/api/cart 正文:

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

还有这一行:

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

有点错误,因为您没有名为“GetCart”的路线


推荐阅读