web-dev-qa-db-fra.com

Contrôleur MVC est appelé deux fois

J'ai un contrôleur qui est appelé deux fois à partir d'un appel ActionLink. 

Ma page d'accueil contient un lien qui appelle la méthode Index du contrôleur de lecture lorsque l'utilisateur clique dessus. Un identifiant de 100 est transmis à la méthode. Je pense que c'est ce qui cause le problème. Plus à ce sujet ci-dessous.

Voici quelques extraits de code:

Page d'accueil:

<%= Html.ActionLink(“Click Me”, "Index", "Play", new { id = 100  }, null) %>

Contrôleur de jeu:

public ActionResult Index(int? id)
{
        var settings = new Dictionary<string, string>();

        settings.Add("Id", id.ToString());

        ViewData["InitParams"] = settings.ToInitParams();

        return View();
}

Lecture vue:

<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage" %>

(html <head> omitted for brevity)

<body>
    <form id="form1" runat="server" style="height:100%">

Hello

    </form>
</body>

Si je me débarrasse du paramètre de la méthode Index, tout va bien. Si je laisse le paramètre en place, la méthode Index est appelée avec 100 comme id. Après avoir renvoyé la vue, la méthode est appelée une seconde fois avec un paramètre nul.

Je n'arrive pas à comprendre ce qui déclenche le deuxième appel.

Ma première pensée a été d’ajouter un itinéraire spécifique comme celui-ci:

routes.MapRoute(
    "Play", // Route name
    "Play/{id}", // URL with parameters
    new {controller = "Play", action = "Index"} // Parameter defaults
    );

Cela n'a eu d'autre effet que de créer un lien plus joli.

Je ne suis pas sûr d'où aller d'ici.

Merci d'avance.

Meule

28
rboarman

Existe-t-il une autre balise qui pourrait accidentellement référencer la page? Les références de script, les références d'image, les références CSS, tout pourrait être dirigé par erreur vers '.' ou la page en cours.

61

10 heures à courir après ce bogue dans un projet Java Spring Maven.

D'abord sur SELECT, je pensais que Hibernate se connectait deux fois, mais avec INSERT, je pensais que les demandes étaient appelées deux fois. En parcourant le code, j'ai découvert que le contrôleur s'appelait deux fois ...

J'ai essayé toutes les configurations de Spring possibles, pensant que le contexte avait été chargé deux fois ou qu'un bean était instancié deux fois ...

En désespoir de cause, reconstruit le projet pièce par pièce pour enfin ajouter un fragment de HTML et le retour du bogue kaboom.

<img alt="" src="#" />

Le signe a été coupable, recharger l'URL. Je sais que le sujet est ancien, mais j'ai résumé mes recherches avec les mots que je cherchais en vain sur Internet pour trouver une réponse au même problème! Pourrait aider les autres ...

5
Claire

Vous pouvez parcourir le code dans votre vue. Passez et voyez d'où vient le deuxième appel.

3
Alistair

Lors du débogage, j’ai découvert qu’une vue partielle provoquait l’appel du contrôleur une seconde fois. C'est nul, mais je ne vois pas de travail autour de celui-là.

2
usefulBee

il devrait y avoir un balisage HTML qui ne fonctionne pas correctement. s'il vous plaît vérifier toutes les balises img . également vérifier 

<link rel="icon" href="favicon.ico" type="image/x-icon" />
2
vicky

Vous pouvez également essayer de changer votre itinéraire pour cela.

routes.MapRoute( 
    "Play", // Route name 
    "Play/{id}", // URL with parameters 
    new { controller = "Play", action = "Index" , id = "" } // Parameter defaults 
);
1
Mike Geise

Essayez de changer le int? id en int id. La correspondance est établie pour la deuxième fois car vous appelez à nouveau l'index avec un identifiant null.

1
Lester

Quelque chose de très stupide j'ai fait ... avait 2 formulaires sur une page avec un bouton sur chaque formulaire. J'avais ajouté un script pour soumettre un formulaire spécifique en fonction du bouton sur lequel l'utilisateur avait cliqué, mais, comme l'action par défaut d'un bouton sur un formulaire est de le soumettre, il a appelé mon contrôleur deux fois. : ^ (

    $('#SaveButton').click(function (event) {
        $("#AttendanceDetailForm").submit();
    });
1
JTinTX

J'ai eu ce même problème et vérifié toutes les suggestions possibles mais pas de chance alors j'ai remarqué le message d'avertissement suivant JS dans ma console. 

Synchronous XMLHttpRequest sur le thread principal est obsolète en raison de son effets néfastes sur l'expérience de l'utilisateur final. Pour plus d'aide, vérifiez https://xhr.spec.whatwg.org/ .

xmlHttp = new XMLHttpRequest();

J'ai corrigé cela et cela fonctionne pour moi.

Prenez soin de tous vos messages js et warning

Cela peut aider quelqu'un.

0
Siva Shibhi

Mon problème a été résolu en m'assurant que je ne faisais pas double référence à mes fichiers JavaScript, ce que j'étais.

Cela provoquait l'action d'être frappée deux fois lorsque j'ai cliqué sur le lien.

Je sais que ce qui précède a déjà été dit, mais je me suis dit que cela valait la peine de vérifier si vos fichiers sont chargés deux fois, surtout si vous utilisez Partial Views.

J'ai remarqué que dans l'un de mes Partial Views, je lui disais d'utiliser la page de présentation principale qui contenait les scripts responsables de ce qui s'était passé lorsque je cliquais sur les liens. J'ai donc résolu ce problème en définissant simplement layout = null; puisqu'il s'agit de toute façon d'une vue partielle et qu'il est déjà chargé à l'intérieur de la présentation principale.

0
Quiver

Dans mon cas, j'utilisais une vue partielle (donc pas de balises de formulaire) et un gestionnaire de clic sur JQuery pour appeler une méthode dans le contrôleur via Ajax. Mais j’avais déclaré le bouton auquel le gestionnaire était attaché en tant que type Submit. J'ai oublié de passer en e à ma fonction de gestionnaire afin d'appeler e.PreventDefault () !! La méthode Controller a donc été appelée deux fois - une fois à partir d'un appel ajax et une fois pour Submit. La 2ème fois autour des paramètres étaient nuls. Cela m'a causé beaucoup de chagrin. Une si petite chose. Si petit qu'il était facilement négligé. J'espère que ceci aide quelqu'un d'autre.

0
HorsinAround

Dans mon cas, le script distant Yandex.metrika (analogique Google Analytics) était mal configuré. Ce script était présenté sur chaque page. Ainsi, tout contrôleur et toute action ont été appelés deux fois. Vérifiez vos paramètres Ya.metrika pour plus de détails.

0
user3172616

Je faisais également face au même problème. Après avoir minutieusement examiné mon projet, je n’ai trouvé aucun cas de référence vide . Ensuite, j’ai découvert qu’il était causé par FireBug . La désactivation de firebug ou l’utilisation d’un autre navigateur qui n’a pas encore installé Firebug a résolu le problème. 

0
rns