2008-10-21 8 views
1

J'ai quelque chose de similaire à la méthode suivante:Asp.Net MVC Beta: RouteData précédente remplace la RouteData actuelle?

public ActionResult Details(int id) 
    { 
     var viewData = new DetailsViewData 
     { 
      Booth = BoothRepository.Find(id), 
      Category = ItemType.HotBuy 
     }; 
     return View(viewData); 
    } 

et l'itinéraire suivant:

routes.MapRoute("shows","shows/{controller}/{action}/{id}", new {id = 0}); 

Tout fonctionnait bien avant la version bêta, quand j'avais aperçu 3. Maintenant, la méthode remplit l'ID correctement la première fois que j'exécute l'action. Toutefois, la deuxième fois que le contrôleur ModelState contient la valeur de l'ID de dernière utilisation. Cela provoque le ActionInvoker pour l'utiliser dans le paramètre de la méthode au lieu de la valeur Route.

Donc, si j'appelle l'action deux fois sur deux entités différentes les résultats sont tels:

www.mysite.com/shows/Booth/Details/1 => Details(1) 
www.mysite.com/shows/Booth/Details/2 => Details(1) //from ModelState["id"] 

De mon analyse rapide avec réflecteur, il semble qu'il se lie d'abord des paramètres à la ModelState puis aux routes. Cependant, je n'ai jamais rien posté du modèle. Autant que je sache, ModelState ne devrait rien contenir.

Est-ce un bug dans la version bêta, peut-être un bug quelque part dans mon code, ou y a-t-il un élément de design que j'ignore? Tout aperçu de la nature de ModelState et pourquoi cela arrive est apprécié.

EDIT: Je découvert que cette question est en fait un symptôme de ce qui semble être un bug avec le DefaultValueProvider si vous instancier un contrôleur à partir d'un conteneur IoC qui existe pour la durée de vie du Asp.Net application.What arrive est que DefaultValueProvider utilise le premier ControllerContext donné au contrôleur et ne le met jamais à jour jusqu'à ce que le contrôleur soit recréé. Cela entraîne l'utilisation de l'ancien RouteData pour les paramètres de la méthode au lieu du RouteData actuel.

+0

Pourriez-vous marquer l'une des réponses ci-dessous comme réponse, alors je ne continuerai pas à répondre à cette question. : P – Haacked

Répondre

1

Il est difficile pour moi de dire ce que vous attendez et ce qui se passe à partir de votre message. Est-il possible qu'il y ait une erreur dans votre méthode BoothRepository.Find de sorte qu'elle renvoie la même chose à chaque fois?

ModelBinder ne devrait pas affecter cette méthode car le paramètre de la méthode action est un type simple, int.

Ces deux demandes étaient-elles GET? Si vous avez encore des problèmes, pouvez-vous essayer de créer le plus simple repro possible et l'envoyer par courriel à philha - microsoft dot com? EDIT: Le problème a fini par être que le développeur essayait de réutiliser le fournisseur de valeur à travers les demandes (en ayant Castle Windsor gérer le cycle de vie des contrôleurs). À l'heure actuelle, il n'y a pas de support pour réutiliser des instances de contrôleur à travers des requêtes comme avec IHttpHandler qui a une propriété IsReusable. Donc, en général, la réutilisation des contrôleurs à travers les demandes nécessite beaucoup plus de travail de votre part. :)

+0

Ce n'est pas un bug dans le Repo. Le référentiel provient directement de Rhino.Commons. Je l'ai localisé au GetParameterValue (ParameterInfo) de l'actionInvoker. Je vais vous envoyer une version barebones quand j'ai le temps. Merci pour la réponse. – Gilligan

+0

En outre, oui, les deux étaient des requêtes GET. C'est pourquoi je suis confus? Je pensais que le ModelState ne serait rempli que sur POSTS échoué. – Gilligan

+0

Je crois qu'il pourrait être rempli si vous avez passé un paramètre invalide à la méthode d'action même sur la requête GET. Par exemple, si id = "ABC" a été passé, mais id est un int. – Haacked

1

Le problème est le LifeStyle, j'ai complètement oublié le fait qu'il était défini, ce qui signifie que par défaut les contrôleurs utiliseront le mode de vie Singleton. Définir le LifeStyle sur Transient pour tous les contrôleurs va résoudre ce problème.

+0

C'est en fait la solution que je suis allé avec à la fin. – Gilligan

0

si vous utilisez spring.net modifier contrôleur de la singleton « false »

0

Ceci est un problème commun lors de l'utilisation avec le comportement Singleton un conteneur IoC tels que Spring.NET ou Windsor. Les contrôleurs ne doivent pas avoir de comportement singleton car le ControllerContext est par requête, un peu comme HttpContext.

Questions connexes