2010-08-10 15 views
0

Si dans mon contrôleur:ViewData ["s"]. ToString() par rapport à Request.QueryString ["s"]. ToString(), qu'est-ce qui est renvoyé si "s" n'a jamais été défini?

public ActionResult Index() 
{ 
    //no code implied 
    return View; 
} 

Puis dans la vue qui est retourné:

<%if(ViewData["SomeString"].ToString() != "True") {%> show this <%}%> 

je vais obtenir une erreur lors de l'exécution en raison d'une référence d'objet ayant aucun objet.

Cependant à l'intérieur d'une page où je fais:

<%if(Request.QueryString["Something"].ToString() != "True") {%> show this <%}%> 

Mise à jour: Je ne fait obtenir l'erreur.

Éditer: On dirait qu'ils agissent de la même manière après tout.

+0

L'appel de l'élément ToString on NameValueCollection est une opération de duplication. La valeur est déjà une chaîne. Dans ViewDataCollection peut être n'importe quel objet, pourquoi n'écrivez-vous pas simplement si (! (Bool) ViewData ["SomeString"])? Encore mieux utiliser fortement typé ViewData.Model. –

Répondre

3

Les deux ViewData et QueryString renverront null pour clé non existante. Lorsque vous essayez d'appeler une méthode (dans votre cas, ToString) sur une référence d'objet null, vous obtenez un NullReferenceException.

Je ne suis pas sûr de ce qui n'est pas clair dans cette situation.

+0

effectivement je pense que j'ai fait une erreur ici, l'édition ... – BigOmega

+0

Édité la réponse. –

+0

Merci, cela a du sens maintenant. L'exception NullReferenceException est provoquée par l'appel ToString() et non par la comparaison (si ToString est exclu, il ne commettra pas d'erreur lors de la comparaison avec une chaîne même si une clé inexistante est référencée). – BigOmega