2010-05-13 6 views
3

Je travaille avec un petit projet ASP.NET MVC - boutique en ligne.Problème avec View - il ne rafraîchit pas après la mise à jour db

J'ai la méthode addToCart qui ajoute le produit sélectionné au panier - il met à jour la table du chariot dans mon db et affiche la vue du panier avec son contenu. Mais j'ai des problèmes. Alors que db met à jour correctement, la vue ne le fait pas. Je vois que la quantité de produit dans ma base de données est incrémentée correctement mais la quantité affichée n'est pas modifiée. Je dois arrêter de déboguer mon application dans Visual Studia et la redémarrer - alors ma vue affiche des données correctes. Qu'est-ce qui peut être mauvais?

En utilisant LINQ to Entity. Metod Ajouter du référentiel panier:

public void Add(int product, int quantity, string user) 
{ 
    Cart cart = null; 
    cart = (from c in de.Cart 
      where (c.userName == "testUser" && c.productId == product) 
      select c).First(); 
    // query is searching for existing product of testUser and id specified in parameter in cart and get it 

    cart.quantity += 1; //increment quantity 

    de.SaveChanges(); // save entity 
} 

méthode AddToCart de commande:

public void AddToCart(int pid, int quant, string usr) 
{ 
    _cartRep.Add(pid,quant,usr); 
} 

et la méthode qui retourne panier Voir:

public ActionResult Cart() 
{ 
    IEnumerable<CartInfo> model = _cartRep.GetTrans(); 
    return View(model); 
} 

Voici getTrans() mise en œuvre:

public IEnumerable<CartInfo> GetTrans() 
    { 
     using (DBEntities de = new DBEntities()) 
     { 

      return (from c in de.Cart 
        where (c.userName == "testUser") 
        select new CartInfo 
           { 
            Id = c.id, 
            ProductId = c.productId, 
            Quntity = c.quantity, 
            Realized = c.realized, 
            UserName = c.userName, 
            Value = c.value, 
            Products = (from p in de.Product 
               where (p.id == c.productId) 
               select new ProductInfo 
                  { 
                   Category = p.Category, 
                   Desc = p.Description, 
                   Id = p.id, 
                   Image = p.Image, 
                   Name = p.Name, 
                   Quntity = p.Quantity, 
                   Price = p.Price 
                  }) 
           }).ToList(); 
     } 
    } 

Comme vous l'avez vu, j'ai un nom d'utilisateur codé en dur. Je l'ai fait seulement pour les tests. Si je savais que cela fonctionne, je vais améliorer le code. Merci pour un bon conseil avec .FristOrDefault()

+0

Est-il possible, nous pouvons aussi voir le code pour GetTrans() du référentiel du panier? Il y a tellement de problèmes potentiels dans votre code que je peux voir en ce moment, par exemple: vous passez une quantité de produits à Add (pid, quant, usr) et ensuite vous avez codé en dur le nom et la quantité d'utilisateur dans la recherche et l'addition; Que se passe-t-il si l'utilisateur n'a pas ce produit dans son panier pour commencer, ".First()" lèvera une exception (.FirstOrDefault() vous donnera une valeur null si elle ne peut pas en trouver un), etc - Je wouldn ne soyez pas surpris si vous retourniez le mauvais panier d'utilisateurs à ce stade. –

Répondre

1

Voulez-vous retourner le modèle de panier mis à jour à la vue ou le panier d'origine sans les mises à jour?

En réponse aux commentaires

« après le succès que je utilise jquery pour montrer panier » - Comment savez-vous réussi l'appel à AddToCart? Si c'est une méthode void, à moins que les erreurs d'appel (404/500) ne permettent pas à l'appel jQuery de savoir qu'il a réussi. Avez-vous une condition de course en cours (les joies de la programmation asynchrone)?

Par exemple:

  1. appelle jQuery AddToCart qui commence le traitement.
  2. La méthode Void, jQuery n'attend pas de "réponse" (il n'y en aura pas) alors passe à la méthode Success. JQuery appelle ShowCart (ou similaire) qui renvoie le chariot non mis à jour.
  3. AddToCart est terminé, en enregistrant la version mise à jour du panier dans la base de données.
  4. Lors de la prochaine exécution de ShowCart, le chariot mis à jour est renvoyé.
+0

Dans mon contrôleur j'ai la méthode AddToCart de type void qui ajoute le produit au panier (invoque la méthode du modèle Ajouter du panier repo). Pour ajouter un produit au panier, j'utilise jquery qui appelle la méthode AddToCart du contrôleur avec les paramètres spécifiés. Apres avoir reussi j'utilise jquery pour montrer la methode d 'invocation du chariot qui retourne la vue du panier qui n'est pas mise a jour ... – crocodillez

+0

alors est - ce une mauvaise idee d' utiliser jquery pour mettre a jour la base de donnees? – crocodillez

+0

dans le cinquième paragraphe, vous avez écrit que la prochaine mise à jour de ShowCart devrait être retournée. mais dans mon application seulement le redémarrage de l'application dans vs entraîne la mise à jour de l'affichage du panier ... dans le panier repo j'utilise la méthode SaveChanges() qui met à jour les entités. Lorsque l'application est en cours d'exécution après avoir ajouté le produit au panier, je vois que l'enregistrement correct dans db est mis à jour correctement, mais pourquoi la vue ne reçoit pas les données mises à jour? – crocodillez

7

Les aides Html obtiennent des données de l'état du modèle et non du modèle si vous renvoyez la même vue après la publication du formulaire. pour obtenir des données mises à jour dans la vue utiliser le modèle get post de redirection ou ModelState.Clear()

+0

Wow. Le monde a commencé à avoir du sens à nouveau. Cela m'a frappé aujourd'hui. THX. – granadaCoder

0

J'utilise LINQ to Entity. Metod Ajouter du référentiel panier:

public void Add(int product, int quantity, string user) 
    { 
     Cart cart = null; 
     cart = (from c in de.Cart 
       where (c.userName == "testUser" && c.productId == product) 
       select c).First(); 
     // query is searching for existing product of testUser and id specified in parameter in cart and get it 

     cart.quantity += 1; //increment quantity 

     de.SaveChanges(); // save entity 
    } 

méthode AddToCart de commande:

public void AddToCart(int pid, int quant, string usr) 
    { 
     _cartRep.Add(pid,quant,usr); 
    } 

et la méthode qui retourne panier Voir:

public ActionResult Cart() 
    { 
     IEnumerable<CartInfo> model = _cartRep.GetTrans(); 
     return View(model); 
    } 
+0

la prochaine fois il suffit de modifier votre question originale, ne vous inquiétez pas, je l'ai fait pour vous, juste une fois;) – jfar

Questions connexes