2010-03-26 2 views
5

J'ai 2 actions sur un contrôleur:résultats de RedirectToAction dans le modèle null

public class CalculatorsController : Controller 
{ 
    // 
    // GET: /Calculators/ 

    public ActionResult Index() 
    { 
     return RedirectToAction("Accounting"); 
    } 


    public ActionResult Accounting() 
    { 
     var combatants = Models.Persistence.InMemoryCombatantPersistence.GetCombatants(); 
     Debug.Assert(combatants != null); 
     var bvm = new BalanceViewModel(combatants); 
     Debug.Assert(bvm!=null); 
     Debug.Assert(bvm.Combatants != null); 
     return View(bvm); 
    } 

} 

Lorsque la méthode est appelée Index, je reçois un modèle nul en sortant. Lorsque la méthode comptable est appelée directement via son URL, j'obtiens un modèle hydraté.

+0

Quelle version de MVC utilisez-vous? –

+0

MVC2 RTM Je crois, comment puis-je vérifier que l'application utilise réellement le bon MVC2 CTP/Beta/RTC/RTC2 etc? – Maslow

+0

Suivez ce billet de blog et il devrait vous dire comment diagnostiquer quelle version votre application utilise: http://bradwilson.typepad.com/blog/2010/03/diagnosing-aspnet-mvc-problems.html – amurra

Répondre

1

Ceci est moins une solution qu'une solution de contournement. Je ne suis pas sûr pourquoi vous obtenez un modèle nul car il semble que cela devrait fonctionner. En fait, je peux confirmer le comportement que vous voyez lorsque je l'essaye moi-même. [EDIT: J'ai découvert une faille dans mon code de test initial qui provoquait mon propre modèle nul. Maintenant que cela est corrigé, mon test fonctionne correctement avec RedirectToAction.] S'il y a une raison à cela, je ne le connais pas du haut de ma tête. Maintenant, pour la solution de contournement ... Je suppose que vous le faites de cette façon puisque la route par défaut envoie tout le trafic à http://www.domain.com/Calculators à "Index". Alors pourquoi ne pas créer une nouvelle comme cette voie:

routes.MapRoute(
    "Accounting", 
    "Calculators/{action}/", 
    new { controller = "Calculators", action = "Accounting" } 
); 

Cet itinéraire indique l'action par défaut au contrôleur Calculatrices sera « Comptabilité » au lieu de l'indice.

+0

bien l'idée est que c'est une solution de contournement temporaire jusqu'à ce que j'ai plus de calculatrices plutôt que juste celui. l'ajout d'une route est moins facile à gérer que de le faire dans le contrôleur et de changer plus tard le contrôleur d'index quand j'ai quelque chose de mieux à faire. – Maslow

+0

Je peux comprendre cela. De plus, j'ai pu obtenir ceci pour travailler dans un de mes propres projets sans n'importe quelle configuration spéciale ainsi ceci devrait fonctionner pour toi aussi bien. La vue Comptabilité est-elle fortement typée (c'est-à-dire a-t-elle quelque chose comme Inherits = "System.Web.Mvc.ViewPage " en haut)? –

1

Votre vue pour la comptabilité d'action attend un modèle. (le BalanceViewModel). La méthode d'action d'index n'a pas une instance de BalanceViewModel.

Vous pouvez résoudre ce problème de plusieurs façons. Dans votre vue (page aspx) vous pouvez vérifier les valeurs nulles ...

Ou dans la méthode d'action d'index, vous créez une nouvelle instance d'un modèle BalanceViewModel et le stockez dans TempData, puis récupérez cela dans votre vue lorsque votre modèle est nul. Ou dans votre méthode d'action, vous pouvez également appeler return View ("Accounting", nouveau BalanceViewModel()) au lieu d'utiliser rediriger vers l'action.

EDIT: Exemple de code - Si vous souhaitez partager cette functinality, créez une méthode privée comme ceci:

public class CalculatorsController : Controller { 
    // GET: /Calculators/ 
    public ActionResult Index() { 
     return View(GetBalanceViewModel()); 
    } 

    public ActionResult Accounting() { 
     return View(GetBalanceViewModel()); 
    } 

    private BalanceViewModel GetBalanceViewModel() { 
     var combatants = Models.Persistence.InMemoryCombatantPersistence.GetCombatants(); 
     Debug.Assert(combatants != null); 
     var bvm = new BalanceViewModel(combatants); 
     Debug.Assert(bvm != null); 
     Debug.Assert(bvm.Combatants != null); 
     return bvm; 
    } 
} 

Avez-vous vu cette Question?

+0

Pourquoi ai-je besoin de fournir le modèle dans l'action d'index si tout ce que je veux que l'action d'index fasse est de passer à une autre action? – Maslow

+0

Si c'est le cas, avez-vous essayé de retourner le résultat de la comptabilité? quelque chose comme: return Accounting(); dans la méthode d'action d'index. (Juste une supposition, ne l'ai pas encore essayé moi-même) –

Questions connexes