2010-02-01 5 views
0

Méthodes de ma classe contrôleurProblème avec ModelBinding dans ASP.NET MVC

public RedirectToRouteResult AddToCart(Cart cart, int productID, string returnUrl) 
      { 
       Product product = productsRepository.Products.FirstOrDefault(p => p.ProductID == productID); 
       cart.AddItem(product, 1); 
       return RedirectToAction("Index", new { returnUrl }); 
      } 

public ViewResult Index(Cart cart, string returnUrl) 
     { 
      ViewData["returnUrl"] = returnUrl; 
      ViewData["CurrentCategory"] = "Cart"; 
      return View(cart); 
     } 

J'ai aussi mis en œuvre un ModelBinder comme suit:

public class CartModelBinder : IModelBinder 
{ 
    private const string cartSessionKey = "_cart"; 

    #region IModelBinder Members 

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     if (bindingContext.Model != null) 
      throw new InvalidOperationException("Cannot update instances"); 
     Cart cart = (Cart)controllerContext.HttpContext.Session[cartSessionKey]; 
     if (cart == null) 
     { 
      cart = new Cart(); 
      controllerContext.HttpContext.Session["cartSessionKey"] = cart; 
     } 
     return cart; 
    } 
    #endregion 
} 

Je ne reçois pas les informations de panier dans mon avis d'index afin il affiche mon panier vide. Je ne suis pas sûr de ce qui ne va pas, mais je ne vois certainement pas le panier dans la méthode d'action Index.

En outre, mon avis est

<content name="TitleContent"> 
    SportsStore: Your Cart 
</content> 
<content name="MainContent"> 
    <viewdata model="DomainModel.Entities.Cart"/> 
    <h2>Your Cart</h2> 
    <table width="90%" align="center"> 
     <thead><tr> 
      <th align="center">Quantity</th> 
      <th align="center">Item</th> 
      <th align="center">Price</th> 
      <th align="center">SubTotal</th> 
     </tr></thead> 
     <tbody> 
     <for each = "var line in Model.Lines" >    
      <tr> 
       <td align="center">${line.Quantity}</td> 
       <td align="left">${line.Product.Name}</td> 
       <td align="right">${line.Product.Price.ToString("c")}</td> 
       <td align="right">${(line.Quantity * line.Product.Price).ToString("c")}</td> 
      </tr>   
     </for> 
     </tbody> 
     <tfoot><tr> 
      <td colspan="3" align="right">Total:</td> 
      <td align="right"> 
       ${Model.ComputeTotalValue().ToString("c")} 
      </td> 
     </tr></tfoot> 
    </table> 
    <p align="center" class="actionButtons"/> 
     <a href="${Html.Encode(ViewData["returnUrl"])}">Continue Shopping</a> 
    </p> 
</content> 

Répondre

1

RedirectToAction ne passe aucune information. il ne fait qu'une redirection HTTP régulière.

Pourquoi ne pas en train de faire:

public ViewResult AddToCart(Cart cart, int productID, string returnUrl) 
{ 
     Product product = productsRepository.Products 
            .FirstOrDefault(p => p.ProductID == productID); 
     cart.AddItem(product, 1); 

     ViewData["returnUrl"] = returnUrl; 
     ViewData["CurrentCategory"] = "Cart"; 
     return View("Index", cart); 
} 
+0

Vous avez raison! Il se pourrait que ModelBinding ne se produise pas. Je ne reçois pas les informations du panier dans ma méthode d'indexation. –

+0

L'information de panier est nulle quand il s'agit de la méthode d'action Index. –