Я читаю книгу Free ASP.NET MVC3 Framework от Freeman и Sanderson и у меня есть вопрос по поводу некоторого кода. Это может быть вопрос новичка, но я нашел полезными вопросы людей относительно примеров в этой книге.
Контроллер Cart в примере SportsStore помечает действие Checkout как HttpPost, но ни действия AddToCart, ни RemoveFromCart не помечаются как HttpPost. Но они оба получают отправленные формы и изменяют основную модель корзины. Разве это не определение того, когда использовать HttpPost?
Конечно, изменения модели не сохраняются в базе данных в этом примере, но только для простоты. Модель изменяется в действиях AddToCart и RemoveFromCart столько же, сколько и действие Checkout.
Кстати - код работает одинаково с 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());
}
}
}