9
votes

Contrôleur MVC appelé deux fois

J'ai un contrôleur de produit avec une action d'index, qui crée essentiellement le formulaire d'affichage pour l'action Post et Index (Post Action verbe) sur le produitController qui enregistre essentiellement le produit à DB, mais lorsque des erreurs de validation se produisent, je retourne une vue ( myModel) d'autre lors de l'enregistrement, je retourne RedirectToaction ("créé," produit ") mais pour une raison quelconque lorsque je pause dans le code, il frappe l'action du contrôleur de produit deux fois plus qu'une seule fois. Par conséquent, le produit a 2 enregistrements à la place. d'un.

public ActionResult Index()
{
    return View()
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(FormCollection fc)
{
    // 2 calls are made to this controller
    try
    {
        // save the product
        return RedirectToAction("Created"); 
    }
    catch(Exception ex)
    {
        // recreate the model from form collection
        return View(viewData); // when a validation error occurs it comes into the catch block 
    }
}


10 commentaires

Vous devriez corriger votre nom de nommage - contrôleur! = Action. Je ne peux pas encore modifier votre poste. : /


Vous n'avez pas besoin de 2 actions d'index, s'ils diffèrent par 1 paramètre nullable.


Au lieu de passer de la formulaire, essayez de reliure: «Action publique Save (produit de produit) {...}".


Je n'ai pas compris ce que vous vouliez dire contrôleur! = Action? Où est-ce que je vais mal ..Can vous s'il vous plaît commenter


Produit - contrôleur; Index - action du contrôleur; Index.aspx - Voir. Cela me semble incorrect: "Renvoyer l'index (NULL); // Ce contrôleur a été appelé intialement".


Quoi qu'il en soit, je ne trouve aucune raison pour que cette action soit appelée deux fois. Je suis aveugle / muet ou une autre information devrait être fournie.


Vous devez afficher le formulaire HTML qui publie cette action de contrôleur (sauvegarde). Cela pourrait nous montrer pourquoi il s'agit de poster deux fois.


Utilisez-vous un conteneur de COI? Si tel est le cas, vérifiez simplement la durée de vie par défaut de votre contrôleur.


J'ai changé mon code conformément aux commentaires et je n'ai qu'une action d'index et une action d'index avec le verbe post-verbe, mais l'index avec post-verbe est appelé deux fois.no iocs utilisé


Vous devez toujours nous montrer le formulaire HTML qui publie cette action indexée. Il pourrait y avoir une erreur là-bas qui le rend postal deux fois.


4 Réponses :


16
votes

Parfois, j'ai trouvé Firebug de causer ce comportement. Essayez de désactiver son script panneau , si vous l'avez installé.

Explication: Dans certains cas, Firebug ne peut pas obtenir les sources de script pour l'affichage dans son panneau de script. Dans ces cas, il initie une deuxième demande de les obtenir. Voir Numéro 7401 pour une discussion à ce sujet, qui atténue le problème et est fixé avec Firebug 2.0.2.


6 commentaires

Cela a été une vitre sérieuse dans les joues du cul :( aussi, faites attention à Yslow en faisant la même chose si elle est définie sur l'auto-exécution évidemment!


OMG. J'ai passé une demi-heure à essayer de comprendre cela. Ensuite, j'ai décidé de rechercher Stackoverflow. Merci!


Merci, n'aurait pas pensé à désactiver Firebug.


Si vous souhaitez garder Firebug activé, vous pouvez essayer de retourner une vue au lieu de rediriger pendant le mode de débogage: #if (débogage) Vue de retour ("Newaction"); #elle retour RedirectToaction ("NewAction", Nouveau {id = ViewModel.ID}); #fin si


Vient de remarquer que le chrome 18.0.1025.168 le fait aussi ... avec ou sans outils de développeur ouverts


Trois ans plus tard et j'ai pris le même problème. Déchiré ce que les petits cheveux que je sors pendant quelques heures jusqu'à ce que j'ai trouvé cette réponse!



14
votes

Voici une liste de contrôle de base (copiée de ici ):

  1. Vérifiez que vous n'avez aucune image ou un autre élément dans la vue avec un vide src attribut ( par exemple) ou avoir src attribut référençant quelque chose qui n'existe plus. Tu ferais mieux Vérifiez directement dans la "source de la page" du navigateur, que dans la vue elle-même en raison de la Possibilité de problèmes "dynamiques" lorsque la vue est rendue. Une fois que vous Trouvez un tel élément vide dans la page HTML SOURCE SON STI HALLITAIRE À Trouvez le même élément à votre avis et corrigez le problème. Cela peut également se produire avec .

  2. Vérifiez que vous n'avez pas de AJAX Appels référençant un URL vide (navigateurs interprétera une URL vide comme le Page actuelle et demandera à nouveau la page actuelle en faisant à nouveau le contrôleur Action Exécutez peu de fois).

  3. Vous avez oublié de retourner "FALSE" à partir de JavaScript Cliquez sur le gestionnaire d'événements pour un lien ou un bouton qui fait un AJAX appel . Si vous oubliez de "renvoyer false" , le navigateur interprète simplement l'action par défaut du lien - régulier, non ajax , appelant à nouveau la même page) < / li>

  4. Parfois Firebug et Yslow [Firefox (FF) Plugins] Peut causer de tels problèmes. Juste temporairement les désactiver dans FF ou tester avec un navigateur différent.

  5. Faites attention aux filtres en double décorant votre contrôleur ou votre action. (c'était mon problème)


5 commentaires

J'ai vu ce comportement. J'ai eu une grille avec l'attribut IMG SRC, étant définie sur # et le contrôleur obtenait pour chaque image. Encore une fois cette chose ne se produit que dans FF. Quel navigateur de succion. Je suis à nouveau cette question. Gratter ma tête pour trouver la ligne dans 1200 lignes ...


Merci Leniel MacAferi, j'ai passé beaucoup de temps à comprendre que mon cas était .


Cela a fonctionné après avoir supprimé le de ma page de mise en page.


# 1 pour moi. Sous un


Pour moi, le problème était img avec src = "#", en supprimant cet attribut résolu le problème.



0
votes

J'ai eu un problème similaire avec une action du contrôleur qui a généré une image et je ne le voyais que avec Firefox. Il y a un bug vraiment vieux qui cause cela, que je suppose est toujours là.

https://bugzilla.mozilla.org/show_bug.cgi?id=304574 < / a>


0 commentaires

5
votes

Une autre solution pour cette affaire ..

J'avais le même problème, en cours d'exécution et de tester de chrome . Je ne pouvais pas le déboguer car le deuxième appel venait de (appel externe). Je l'ai testé au hasard dans Firefox et Internet Explorer où il n'y avait pas de double coup.

Quelle que soit la méchante c'était, j'ai Cache chromé supprimé (tout !!!) et le problème a été résolu.

J'espère que cela aidera certains d'entre vous :)


0 commentaires