L'exécution de Javascript MVC code en Cas de déclaration incorrecte
Je suis un peu perplexe avec le code suivant. Il a bien fonctionné dans VS2010 sur Windows 7, et maintenant que j'ai mis à jour le matériel de Windows 8 et visual studio 2012, il ne fonctionne pas.
J'ai le code JavaScript suivant dans mon application MVC:
<script language="javascript" type="text/javascript">
var today;
if("@Model.Birthday.HasValue"){
var today = new Date("@Model.Birthday.Value.Year", "@Model.Birthday.Value.Month" - 1, "@Model.Birthday.Value.Day");
}else{
today = new Date();
}
Le Modèle est en tirant à partir d'un ViewModel qui a une propriété qui ressemble à ceci:
public System.DateTime? Birthday
{
get { return user.Birthday; }
set { user.Birthday = value; }
}
L'exception est levée dans la ligne:
var today = new Date("@Model.Birthday.Value.Year", "@Model.Birthday.Value.Month" - 1, "@Model.Birthday.Value.Day");
Il revient avec "Nullable objet doit avoir la valeur", il devrait, si il saute dans la ligne pour l'exécuter. Mais, si la déclaration est de retour faux. Si je supprime la ligne et il vous suffit de mettre une alerte déclaration, il ne s'exécute jamais que la ligne ou l'alerte, parce que l'Anniversaire de la propriété est null. Quelque chose semble avoir changé dans la façon dont JS s'exécute MVC code, et il semble pour évaluer l'ensemble du bloc de code, indépendamment de l'instruction if. J'ai aussi essayé le suivant, mais en vain:
- Testé dans Chrome pour W8
- Testé dans un bloc try /catch. Fait intéressant, il n'a pas d'attraper l'exception (je suppose que JS ne sera pas attraper .NET exceptions)
- Testé, en indiquant expressément @Modèle.D'anniversaire.HasValue == true
- Testé par @Modèle.D'anniversaire.La valeur != null
- Testé en mode Release sur le Mode de Débogage
Cela devrait être simple test pour voir si une valeur est nulle, et si c'est pas le cas, créez un JS objet Date de l' .NETS de la propriété, si elle est, de créer un nouveau JS Date objet, mais pour une raison quelconque, il veut évaluer et d'exécuter cette ligne, même si HasValue est faux.
Vraiment perplexe. Quelqu'un a vu quelque chose comme ça?
eh bien, techniquement, dans la mise à niveau du logiciel, j'ai eu une nouvelle machine de dev, j'ai donc fait la mise à niveau le matériel et le logiciel. Peu importe, il a travaillé dans VS2010 sur IE 9 sans problème, maintenant, il échoue.
OriginalL'auteur Tyler Davey | 2012-11-04
Vous devez vous connecter pour publier un commentaire.
Je peux voir un couple de choses qui se passent ici et qui ont un impact sur votre capacité à rendre les données correctes.
Tout d'abord, le MVC variables sont traitées sur le côté serveur. Votre application est toujours en essayant de rendre une valeur pour le
@Model.Birthday.Value
propriétés dans votre Javascript pour générer le code HTML. Ce sera le cas, peu importe si la propriété est vraie ou fausse dans votre exemple car c'est en s'appuyant sur le Javascript côté client pour faire du conditionnel et pas de Rasoir. Ci-dessous est un exemple de travail de votre problème.Modèle De Vue
Contrôleur
Vue
Maintenant, évidemment, le code est dupliqué dans la section Javascript, afin de montrer qu'il fonctionne pour les Nuls et les valeurs Non null dans la même action de contrôleur.
Comme vous pouvez le voir dans le point de Vue, nous allons nous assurer que nous sommes à l'aide de la syntaxe Razor pour la vérification du Modèle et Javascript pour le réglage du côté client réelle de la variable. Aussi, je me demande si votre "- 1 " a été fonctionne correctement. Afin de faire la soustraction dans cet exemple, j'ai jeté que la valeur d'un Int à partir du Javascript, mais c'est un détail mineur.
Pour la référence, c'est un MVC 4 projet sur VS2012, Windows 8 Professional testé avec google Chrome.
OriginalL'auteur Tommy
Solution en un mot:
J'ai testé ton code et il pourrait dire, il n'y a pas de problème avec votre HW/SW update. Je suis en cours d'exécution par rapport à 2010 sur Win 7.
La solution pourrait être
Modifier votre code pour l'exemple de cette façon
Explication détaillée:
de trouver la réponse à laisser split, qu'est-ce que l'extrait de code ci-dessus en train de faire. Il est juste de la génération d'un code HTML. Nous allons voir étape par étape
I. HasValue
@Modèle.Anniversaire = new Date(2012,11,4)
1) Rasoir est l'envoi de flux de Réponse de la chaîne jusqu'à la première @ opérateur
2) ici Rasoir évalue cette partie
@Modèle.D'anniversaire.HasValue comme un booléen, et la convertit en chaîne afin de la partie suivante de code serait
3) Ajouter ensuite chaîne direct
4) evaluat l' @Modèle.D'anniversaire.De la valeur.Année et injecter de sa chaîne de valeur
5) 6) 7) ... et ainsi de suite
le résultat final envoyé à Réponse est:
II. Date de naissance est NULL
Dans le cas où l' @Modèle.Anniversaire = null les premières étapes 1), 2) et 3) sont les mêmes:
4) Exception Nullable objet doit avoir une valeur
Enfin, il y a un endroit où nous obtenons le Nullable exception.
@Modèle.D'anniversaire.De la valeur.Année
est appelée lors de l'
@Modèle.Anniversaire == null
Heureux que ça aide 😉
OriginalL'auteur Radim Köhler
Le problème, c'est que vous avez mélangé le code côté client et côté serveur code. Le javascript est exécuté côté client, mais seulement après que tous du côté serveur, le code a été complété.
Donc @Modèle.D'anniversaire.HasValue, @Modèle.D'anniversaire.De la valeur.L'année, etc. seront tous évalués sur le côté serveur, avant qu'il ne se fait jamais n'importe où près du navigateur. Le code javascript (et donc dans ce cas, l'instruction if) n'arriverons jamais au navigateur que l'exception est survenue côté serveur, en essayant d'évaluer le Modèle.D'anniversaire.De la valeur.Année sur un objet null.
Vous avez besoin de déplacer le conditionnel côté serveur, par exemple
OriginalL'auteur CupawnTae
Multi-ligne de Code
Une seule ligne de code
OriginalL'auteur Rikin Patel