2012-02-22 3 views
0

프리먼 (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()); 
     } 
    } 
} 

답변

0

는, 샌더슨 & 친구가 세션 기반 장바구니 개체에 액세스하는 특별한 ModelBinder를 사용하지된다 아래

이 책에서 최종 컨트롤러 클래스 권리?

기술적으로 책의 구현이 올바르지 않습니다. 동작이 기본 응용 프로그램에 영향을 미치지 않기 때문입니다. 세션 기반 스토리지는 일시적이므로 영구적 인 변경 사항을 나타내지 않습니다.

실제 응용 프로그램에서는 카트 항목 추가/제거 작업에 멱등 원 HttpPut 및 HttpDelete (또는 비 멱등 원 HttpPost)를 사용할 수 있습니다. 그러나 실제 응용 프로그램은 이러한 일들을 불안정한 세션 저장소에 보관하지 않을 것입니다.

나는이 책이 방대한 저장 테이블을 만들지 않고도 응용 프로그램의 예를 보여 주려하고 있다고 생각합니다.

+0

예, 장바구니는 세션 개체로 저장됩니다. 그러나 Cart 객체가 결국 데이터베이스 테이블에 저장되면 이러한 함수는 HttpPost가되어야합니다. 맞습니까? –

+0

물론입니다. 또는 멱등 찮은 행동을 할 수 있다면 카트에 추가를 위해 HttpPut을, 카트에서 제거를 위해 HttpDelete를 사용할 수 있습니다. 하지만 당신의 행동이 멱등수가 아니라면, HttpPost를 사용하십시오. – danludwig

+0

멱등수라는 단어를 소개해 주셔서 감사합니다. :) –

0

가 나는 또한 디폴트로 설정 CartController 내에서 사용할 수있는 액션이있는 한 코드에서 체크 아웃 ActionResult가 [HttpPost]로 장식되어 있다고 생각 HttpGet

public ViewResult Checkout() 
    { 
     return View(new ShippingDetails()); 
    } 

도 AddToCart와도 RemoveFromCart 행동은하지 않습니다 모델 바인딩으로 인해 HttpGet을 통해 사용할 수 없으므로 HttpPost로 표시됩니다.

+0

질문은 두 개의 체크 아웃 작업에 관한 것이 아니라 AddToCart 및 RemoveFromCart 작업에 관한 것입니다. –

+0

질문에 언급 한 - SportsStore 예제의 장바구니 컨트롤러는 Checkout 동작을 HttpPost로 표시하지만 AddToCart 및 RemoveFromCart 동작은 HttpPost로 표시되지 않습니다 –

-1

내 제한된 경험으로 일관성을 위해 [HttpPost]로 표시되어야한다고 말하고 싶습니다. 이 책의 다른 예에서는 2 개의 액션 메소드가 같은 이름을 갖는 경우가 있습니다.

public ActionResult Edit(intId) 
{ 
... 
} 

[HttpPost] 
public ActionResult Edit(EditViewModel model) 
{ 
... 
} 

HttpPost 메서드를 이와 같이 표시하면 메서드 이름을 쉽게 지정할 수 있습니다. 이 예에서는 오직 1 개의 AddToCart mehod 만 있으므로 구분할 필요가 없을 것입니다.