私はFreemanとSandersonのPro ASP.NET MVC3 Frameworkの本を読んでいて、いくつかのコードについて質問があります。これは初心者の質問かもしれませんが、私はこの本の例に関する人々の質問が役に立つことを発見しました。MVC3 SportsStoreの例:AddToCartにHttpPostとマークする必要がありますか?
SportsStoreの例のカートコントローラは、CheckoutアクションをHttpPostとしてマークしますが、AddToCartアクションもRemoveFromCartアクションもHttpPostとしてマークされていません。しかし、彼らはフォーム提出を受け取り、基本的なカートモデルを修正する。それはHttpPostをいつ使うべきかという定義ですか?
許可されているモデル変更は、この例ではデータベースに保持されていませんが、単純化のためです。モデルは、Checkoutアクションと同じようにAddToCartアクションとRemoveFromCartアクションで変更されています。
btw - コードはHttpPostの有無にかかわらず同じです。したがって、これは主にベストプラクティスに関する質問です。
以下帳から、最終的なコントローラクラスである:...私は本からリコール場合は、サンダーソン& PALは、セッションベースのカートのオブジェクトにアクセスするための特別なModelBinderを使用
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
私に冪等級という言葉を紹介してくれてありがとう。 :) –