asp.net - 如何将项目从一个控制器添加到另一个控制器?
问题描述
我正在学习 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 对我来说是全新的,我完全不知道如何解决这个问题。
解决方案
您的 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:
发布:/api/cart 正文:
{
"id": 0,
"name": null,
"price": 0.0,
"isComplete": false
}
还有这一行:
CreatedAtRoute("GetCart", new { id = model.Id }, model);
有点错误,因为您没有名为“GetCart”的路线
推荐阅读
- list - 用搜索栏过滤长列表非常慢
- oracle - Oracle 19C - 尝试在 DBMS_LOCK 上授予执行时出错
- json - Receive Json sent from Angular to Laravel
- postgresql - Postges - 多列索引 - 前导(最左边)列
- javascript - 如何同时为所有用户运行 JavaScript 代码并为所有用户显示相同的生成数字
- php - Symfony“未检测到 PHP 二进制文件”
- python - 为什么numpy数组中相同索引选择的输出存在差异
- mysql - How to copy column values to a new SQL table, remove duplicates and create mappings?
- java - Why does java.util.Optional.ofNullable() expect @NonNullable?
- julia - 为值分配颜色