프리먼 (Freeman)과 샌더슨 (Sanderson)의 Pro ASP.NET MVC3 Framework 책을 읽고 있는데 코드에 대한 질문이 있습니다. 이것은 초보자 용 질문 일지 모르지만이 책의 예와 관련하여 사람들의 질문이 유용하다고 생각합니다.MVC3 SportsStore 예 : AddToCart를 HttpPost로 표시해야합니까?
SportsStore 예제의 장바구니 컨트롤러는 Checkout 동작을 HttpPost로 표시하지만 AddToCart 및 RemoveFromCart 동작은 HttpPost로 표시되지 않습니다. 그러나 그들은 양식 제출을 받고 기본 장바구니 모델을 수정합니다. HttpPost를 사용할 때의 정의가 아닌가?
부여 된 모델 변경 사항은이 예제에서 데이터베이스에 유지되지 않지만 단순화를 위해서입니다. AddToCart 및 RemoveFromCart 작업에서 Checkout 작업과 마찬가지로 모델이 변경됩니다.
btw - 코드는 HttpPost를 포함하거나 포함하지 않고 동일하게 작동합니다. 이것은 모범 사례에 관한 질문입니다. ... 그게 내가 책에서 기억 경우
namespace SportsStore.WebUI.Controllers
{
public class CartController : Controller
{
private IProductRepository repository;
private IOrderProcessor orderProcessor;
public CartController(IProductRepository repo, IOrderProcessor proc)
{
repository = repo;
orderProcessor = proc;
}
public RedirectToRouteResult AddToCart(Cart cart, int productID, string returnUrl) {
Product product = repository.Products
.FirstOrDefault(p => p.ProductID == productID);
if (product != null) {
cart.AddItem(product, 1);
}
return RedirectToAction("Index", new {returnUrl});
}
public RedirectToRouteResult RemoveFromCart(Cart cart, int productId, string returnUrl)
{
Product product = repository.Products
.FirstOrDefault(p => p.ProductID == productId);
if (product != null)
{
cart.RemoveLine(product);
}
return RedirectToAction("Index", new { returnUrl });
}
public ViewResult Index(Cart cart, string returnUrl)
{
return View(new CartIndexViewModel
{
Cart = cart,
ReturnUrl = returnUrl
});
}
public ViewResult Summary(Cart cart)
{
return View(cart);
}
[HttpPost]
public ViewResult Checkout(Cart cart, ShippingDetails shippingDetails)
{
if (cart.Lines.Count() == 0)
{
ModelState.AddModelError("", "Sorry your cart is empty");
}
if (ModelState.IsValid)
{
orderProcessor.ProcessOrder(cart, shippingDetails);
cart.Clear();
return View("Completed");
}
else
{
return View(shippingDetails);
}
}
public ViewResult Checkout()
{
return View(new ShippingDetails());
}
}
}
예, 장바구니는 세션 개체로 저장됩니다. 그러나 Cart 객체가 결국 데이터베이스 테이블에 저장되면 이러한 함수는 HttpPost가되어야합니다. 맞습니까? –
물론입니다. 또는 멱등 찮은 행동을 할 수 있다면 카트에 추가를 위해 HttpPut을, 카트에서 제거를 위해 HttpDelete를 사용할 수 있습니다. 하지만 당신의 행동이 멱등수가 아니라면, HttpPost를 사용하십시오. – danludwig
멱등수라는 단어를 소개해 주셔서 감사합니다. :) –