MVC3アプリケーション用のカスタムモデルバインダーを作成しました。カスタムモデルバインダーを使用することにしたのは、セッションを使用していて、それらが原因で単体テストが失敗するためです。
私の問題は、About
アクションがパラメータを受け入れないことですが、Sessionを使用せずに表示するには、カートに保存されている値を渡す必要があります。セッションを使用すると、単体テストに失敗するためです。モデルバインダーは、カートをパラメーターとしてに渡した場合にのみ機能しますAbout
。
何かアイデアがあれば教えてください。
どうもありがとう
モデルバインダー
public class CartModelBinder : IModelBinder
{
private const string CartSessionKey = "Cart";
public object BindModel(ControllerContext controllerContext, ModelBindingContext modelBindingContext)
{
Cart cart = null;
if(IsCartExistInSession(controllerContext))
{
cart = GetCartFromSession(controllerContext);
}
else
{
cart = new Cart();
AddCartToSession(controllerContext, cart);
}
return cart;
}
private static Cart GetCartFromSession(ControllerContext controllerContext)
{
return controllerContext.HttpContext.Session[CartSessionKey] as Cart;
}
private static void AddCartToSession(ControllerContext controllerContext, Cart cart)
{
controllerContext.HttpContext.Session[CartSessionKey] = cart;
}
private static bool IsCartExistInSession(ControllerContext controllerContext)
{
return controllerContext.HttpContext.Session[CartSessionKey] != null;
}
}
コントローラ
[HttpPost]
public ActionResult AddToCartfromAbout(Cart cart, int productId = 2)
{
var product = _productRepository.Products.First(p => p.ProductId == productId);
cart.AddItem(product, 1);
return View("About");
}
public ActionResult About()
{
// Need something here to get the value of cart
return View(cart);
}