MVC 3 Rasoir Vue: Génération de JavaScript à partir d'un modèle booléen valeur
Je suis en utilisant ASP.Net MVC 3 Rasoir moteur d'affichage.
J'ai une obligation de générer du code JavaScript dans mon point de Vue basé sur une valeur dans mon Modèle de Vue. La valeur que j'ai besoin d'un booléen, pour cet exemple permet de l'appeler IsSet
.
Donc ce que je veux faire est de créer un JavaScript booléen basé sur cette valeur que je peux utiliser dans le script plus tard.
Garder à l'esprit que, pour tous les exemples ci-dessous, j'ai ce bout de code en haut de mon point de vue...
@{ string IsSet = Model.IsSet ? "true" : "false"; }
NOTE: Tous les exemples ci-dessous sont JavaScript.
Première tentative...
var IsSet = @(IsSet);
... cela fonctionne, le problème, c'est qu'elle casse l'auto-mise en forme (CTRL + E, D) dans VS 2010 en raison d'une mauvaise mise en forme JavaScript - comme vous vous en doutez, et ce n'est pas acceptable.
Deuxième tentative...
var IsSet = "@(IsSet)";
...Je sais, JavaScript est intelligent, il s'auto-analyser ma chaîne si nécessaire. Ooops, j'ai oublié c'est un type de chaîne et de rien d'autre que le vide est évaluée à true.
Troisième tentative...
var IsSet = Boolean("@(IsSet)");
....certes, cela fonctionne... nan, convertir une chaîne non vide de vrai nouveau (mauvais analyseur!)
Quatrième tentative...
var IsSet = "@(IsSet)" === "true";
Enfin quelque chose qui fonctionne, mais il n'a pas l'air très bien pour moi.
Je vais utiliser cette si nécessaire, mais en fin de compte, ma question est: Est-il une meilleure façon de gérer ce genre de situation? Peut-être, le comportement indésirable dans ma première tentative est juste quelque chose que Microsoft peut être négligé?
Si quelqu'un a une jolie et soignée cinquième tentative pour moi, ce serait bien.
L'important pour moi est que l'auto-mise en forme dans VS 2010 ne prend pas en pause
Grâce
- J'aimerais être d'accord avec votre première tentative - qui ressemble le plus naturel pour moi, que vous n'êtes pas stringifying et puis quelque chose de casting, qui était déjà un Booléen en premier lieu! J'ai utilisé cette technique beaucoup tout au long de mon Rasoir / code JS et il semble fonctionner très bien, et je n'ai pas vu de problèmes avec l'auto-mise en forme, mais je ne l'utilisation de ReSharper alors peut-être qu'il corrige automatiquement!
- J'utilise ReSharper et je continue de courir dans l'auto-problème de mise en forme, donc je ne suis pas sûr que c'est pourquoi vous n'êtes pas frapper problèmes de mise en forme. L'auto-mise en forme et la capitalisation problème se produit lorsque vous avez Pascal-tubé Rasoir variables apparaissant dans les endroits où le formateur de mettre en minuscule appellation, tels que les noms de balises HTML ou du code JS (principalement camelCase; en particulier, le module de formatage des coups de pied dans quand l'auto-indentation se produit...Donc Chris, j'ai un pressentiment que vous pourriez avoir eu un autre scénario?
Vous devez vous connecter pour publier un commentaire.
La Version 1 est le seul de ceux que j'avais vote pour, même si ils ont tous travaillé, parce que c'est la plus lisible. Malheureusement je n'ai pas de VS à la maison donc je ne peux pas l'essayer pour voir ce que l'auto-problème de mise en forme, mais si possible je voudrais d'ignorer le problème et aller de l'avant et utiliser cette version étant donné qu'il n'y a rien fait, le problème avec le code, c'est VS qui est confus. (Vous dites que VS essaie d'interpréter la chose comme JS et donc de trouver qu'il est invalide?)
Mais si vous voulez quelques autres options:
Cinquième tentative...
Forcer la valeur de la chaîne en une valeur booléenne avec l'ancien double-pas-opérateur truc - comme vous l'a déjà souligné à la fois "vrai" et "faux" allait devenir vrai, mais ce problème disparaît si vous utilisez le "vrai" et "" (chaîne vide) - de sorte que vous pouvez utiliser
Boolean()
que par votre "troisième tentative".Sixième tentative...
OK, si vous vous retrouvez avec une assez inutile de fonction en haut de votre page, mais il conserve la variable réelle déclarations raisonnablement bien rangé et si le débogage côté client vous verrez
bool("false")
oubool("true")
.Septième tentative...
Je n'aime pas l'étape supplémentaire de la création du serveur-côté
string IsSet = Model.IsSet ? "true" : "false";
à l'avance. Je ne connais pas la syntaxe Razor, mais pouvez-vous dire quelque chose le long des lignes de:Je pense à tous mes "tentatives" de travail, mais encore une fois je pense que votre "première tentative" est la meilleure option.
@(IsSet)
, ou pouvez-vous dire que@IsSet
? Si ce dernier est OK qui ferait de chaque variation de la plus soignée.Je viens lutté avec le même problème pendant environ une heure. Ma solution finale a été équivalent à celui-ci.
Il ne faut pas de code supplémentaire.
Aucune des versions montré jusqu'à présent (à la fois dans la question et les réponses) est quelque chose que je voudrais utiliser. Voici comment j'allais le faire:
ou si vous avez besoin d'autres propriétés de votre modèle de vue pour être manipulée avec javascript, il pourrait JSON coder l'ensemble du modèle:
@(Html.Raw(Json.Encode(Model.IsSet)));
Comment sur:
@Ajax.ToJson()
? Il n'est pas dans mon intellisense, ou dans GoogleComment sur:
Model.IsSet
bool parce que c'est bool déjà. Deuxièmement, si tu veux le faire en JavaScript, vous avez toujours le même problème que ma première tentative (auto-mise en forme des pauses)Voici ce que j'utilise, à l'intérieur d'un bloc javascript:
Je sais que c'est une vieille question, mais aucune des réponses sont particulièrement élégant.
La solution la plus simple dans ces situations, c'est simplement pour ajouter des
+0
à votre conditionnelle. Cette convertit implicitement bool int, mais comme le résultat est0
ou1
il est immédiatement converti en arrière de nouveau par l'instruction if. Exemple:L'affectation d'une valeur booléenne d'une variable peut être réalisé comme suit:
Le code fonctionne, vous n'obtenez pas de traits rouges ondulés, et Visual Studio formateur est heureux.