今天接續著前面
繼續針對create & Detail去做調整
首先先來看一下初始專案如何create的一個新的poeduct
Scaffold出來的專案是使用async
傳入了一個product物件,並透過Bind去綁定相關的欄位
action裡面是直接使用DBcontext去做更新
首先先新增一個AddProduct在IProductRepository.cs
並在ProductRepository裡面去實作
public void AddProduct(Product product);
ProductRepository.cs
public void AddProduct(Product product)
{
_context.Add(product);
_context.SaveChangesAsync();
}
回到controller,將httpost的action調整如下
另外要注意如果欄位有異動,bind裡面也必須要同步調整
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind("Id,ProductName,Price,Quty")] Product product)
{
if (ModelState.IsValid)
{
_productRepository.AddProduct(product);
return RedirectToAction(nameof(Index));
}
return View(product);
}
也可以在controller裡面找一一個Creat的action,但這個action裡面只有回傳一個view,這個view就是在給一開始新增下去所顯示的form
// GET: Product/Create
public IActionResult Create()
{
return View();
}
重build專案確認一下功能是否正常
關於瀏覽這個部分,同樣先來看一下初始專案的樣板
和新增一樣,是直接讀取DBcontext
先傳入一個id,並用這個id去找對應的Product 物件
回傳給view
在先前已經有在ProductRepository.cs去實作GetProductById這個方法,這邊直接在controller去呼叫就可以了
public Product GetProductById(int id)
{
return GetAllProduct.FirstOrDefault(c => c.Id == id);
}
ProductController.cs
// GET: Product/Details/5
public ActionResult Details(int? id)
{
if (id == null)
{
return NotFound();
}
var product = _productRepository.GetProductById(id.Value);
if (product == null)
{
return NotFound();
}
return View(product);
}
執行畫面
可以看到url是Details/1,其中1就是id
主要是根據我們在UseEndpoints裡面所設定的router
https://localhost:5001/Product/Details/1