2010-03-11 5 views
0

Nous utilisons des étincelles pour générer des messages HTML. Lors de la fusion de nos données dans le modèle que j'ai remarqué une différence entreTest conditionnel du moteur Spark

<if condition="Equals(#context.UserAccount.Country,'BE')"> 
    <p>You live in Belgium</p> 
</if> 
<else> 
    <p>You don't live in Belgium</p> 
</else> 

et

<if condition="#context.UserAccount.Country == 'BE'"> 
    <p>You live in Belgium</p> 
</if> 
<else> 
    <p>You don't live in Belgium</p> 
</else> 

Quand je passe dans un UserAccount avec le pays mis à « être » la première imprime correctement « Vous vivez en Belgique ', le second produit le résultat incorrect.

Quelqu'un peut-il me dire pourquoi? Pouvez-vous tester sur l'égalité des chaînes sans utiliser Equals()?

Répondre

1

Ainsi, le code que vous avez publié génère une erreur de compilation lorsque j'essaie de l'exécuter. Cependant, l'erreur que j'obtiens explique pourquoi vous voyez un comportement différent. L'erreur que j'obtiens son ceci:

CS0252: Warning as Error: Possible unintended reference comparison; 
    to get a value comparison, cast the left hand side to type 'string' 

En regardant le code que génère Spark, l'erreur et le comportement que vous voyez est beaucoup plus logique. Premier morceau de code génère la comparaison suivante:

if (Equals(Eval("context.UserAccount.Country"),"BE")) 

Je suis assez sûr Eval quelque chose de rendement de type object (quel que soit le type réel de la variable est). Ensuite, l'appel à Equals est probablement équivalent à faire:

Eval("context.UserAccount.Country").Equals("BE") 

qui utilise alors la méthode équivaut à une surcharge de la classe de chaîne (merci polymorphism) qui retourne vrai. Où dans le deuxième cas:

if (Eval("context.UserAccount.Country") == "BE") 

fait juste une comparaison de référence entre deux objets, ce qui retourne false.

Si vous n'utilisez pas le # avant context.UserAccount.Country, Spark va générer le code suivant (avis de l'absence d'appel à Eval):

if (context.UserAccount.Country == "BE") 

En supposant context a une propriété UserAccount, qui possède une propriété Country de type string alors l'expression devrait correctement évaluer à vrai quand Country a la valeur de "BE".

+0

Merci pour l'information. Nous utilisons Spark pour générer des emails (en dehors du contexte MVC), c'est peut-être pourquoi vous ne pouvez pas compiler le code. La solution que vous avez proposée n'a pas fonctionné pour moi. J'ai une erreur CS0103: Le nom 'contexte' n'existe pas dans le contexte actuel. Votre réponse est cependant correcte dans le fait que c'est à cause de la fonction EVAL que j'obtiens un résultat incorrect avec le second exemple. Si je convertis le # context.UserAccount.Country explicitement en chaîne. Donc cela fonctionne aussi: if ((string) # context.UserAccount.Country) == "BE"). Merci de me donner l'indice. – Jelle

Questions connexes