J'ai le modèle suivant qui est enveloppé dans mon modèle de vue
public class FloorPlanSettingsModel
{
public int Id { get; set; }
public int? MainFloorPlanId { get; set; }
public string ImageDirectory { get; set; }
public string ThumbnailDirectory { get; set; }
public string IconsDirectory { get; set; }
}
Comment accéder à l'une des propriétés ci-dessus à partir de Javascript?
J'ai essayé ceci, mais je suis devenu "indéfini"
var floorplanSettings = "@Model.FloorPlanSettings";
alert(floorplanSettings.IconsDirectory);
c#
javascript
jquery
asp.net-mvc
model
Référence nulle
la source
la source
Réponses:
Vous pouvez prendre tout votre modèle côté serveur et le transformer en un objet Javascript en procédant comme suit:
Dans votre cas, si vous voulez juste l'objet FloorPlanSettings, passez simplement la
Encode
méthode that property:la source
Comment accéder aux données du modèle dans le bloc de code Javascript / Jquery dans le
.cshtml
fichierIl existe deux types d'
Model
affectations de variable c # ( ) à une variable JavaScript.int
,string
,DateTime
(ex:Model.Name
)Model
,Model.UserSettingsObj
)Regardons dans les détails de ces deux affectations.
Pour le reste de la réponse, considérons le
AppUser
modèle ci-dessous comme un exemple.Et les valeurs que nous attribuons à ce modèle sont
Attribution de propriété
Permet d'utiliser une syntaxe différente pour l'affectation et d'observer les résultats.
1) Sans placer l'attribution de propriété entre guillemets
Comme vous pouvez le voir, il y a quelques erreurs,
Raj
etTrue
est considéré comme des variables javascript et comme elles n'existent pas, c'est unevariable undefined
erreur. Là où, comme pour la variable dateTime, l'erreur est que lesunexpected number
nombres ne peuvent pas avoir de caractères spéciaux, les balises HTML sont converties en ses noms d'entité afin que le navigateur ne mélange pas vos valeurs et le balisage HTML.2) Affectation de propriété enveloppante dans les devis.
Les résultats sont valides, donc mettre l'attribution de propriété entre guillemets nous donne une syntaxe valide. Mais notez que le nombre
Age
est maintenant une chaîne, donc si vous ne voulez pas que nous puissions simplement supprimer les guillemets et il sera rendu comme un type de nombre.3) En utilisant
@Html.Raw
mais sans le mettre entre guillemetsLes résultats sont similaires à ceux de notre cas de test 1. Cependant, l'utilisation
@Html.Raw()
de laHTML
chaîne nous a montré des changements. Le HTML est conservé sans changer ses noms d'entité.À partir de la documentation Html.Raw ()
Mais nous avons toujours des erreurs dans d'autres lignes.
4) Utiliser
@Html.Raw
et également l'envelopper entre guillemetsLes résultats sont bons avec tous les types. Mais nos
HTML
données sont maintenant cassées et cela cassera les scripts. Le problème est que nous utilisons des guillemets simples'
pour envelopper les données et même les données ont des guillemets simples.Nous pouvons surmonter ce problème avec 2 approches.
1) utilisez des guillemets doubles
" "
pour envelopper la partie HTML. Comme les données internes n'ont que des guillemets simples. (Assurez-vous qu'après l'encapsulation avec des guillemets doubles, il n'y en a pas non plus"
dans les données)2) Échappez à la signification du caractère dans votre code côté serveur. Comme
Conclusion de la cession de propriété
Html.Raw
pour interpréter vos données HTML telles quelles.Affectation d'objets
Permet d'utiliser une syntaxe différente pour l'affectation et d'observer les résultats.
1) Sans placer l'attribution d'objets entre guillemets.
Lorsque vous affectez un objet ac # à une variable javascript, la valeur
.ToString()
de cet objet sera attribuée. D'où le résultat ci-dessus.2 Mise en place de l'attribution d'objets entre guillemets
3) Utilisation
Html.Raw
sans guillemets.4) Utilisation
Html.Raw
avec des guillemetsCela
Html.Raw
ne nous a guère servi lors de l'affectation d'un objet à une variable.5) Utilisation
Json.Encode()
sans guillemetsNous voyons des changements, nous voyons que notre modèle est interprété comme un objet. Mais nous avons changé ces caractères spéciaux en
entity names
. Mettre également la syntaxe ci-dessus entre guillemets n'est pas d'une grande utilité. Nous obtenons simplement le même résultat entre guillemets.À partir de la documentation de Json.Encode ()
Comme vous avez déjà rencontré ce
entity Name
problème avec l'attribution de propriété et si vous vous en souvenez, nous l'avons surmonté avec l'utilisation deHtml.Raw
. Alors essayons ça. Permet de combinerHtml.Raw
etJson.Encode
6) En utilisant
Html.Raw
etJson.Encode
sans guillemets.Le résultat est un objet Javascript valide
7) Utilisation
Html.Raw
etJson.Encode
entre guillemets.Comme vous le voyez, l'emballage avec des guillemets nous donne des données JSON
Conslusion sur l'attribution d'objets
Html.Raw
etJson.Encode
en combinaison pour affecter votre objet à une variable javascript en tant qu'objet JavaScript .Html.Raw
etJson.Encode
enveloppez-le égalementquotes
pour obtenir un JSONRemarque: si vous avez observé que le format de données DataTime n'est pas correct. En effet, comme indiqué précédemment,
Converts a data object to a string that is in the JavaScript Object Notation (JSON) format
et JSON ne contient pas dedate
type. D' autres options pour résoudre ce problème est d'ajouter une autre ligne de code pour gérer ce type seul , en date javascipt () objetComment accéder aux données du modèle dans le bloc de code Javascript / Jquery dans le
.js
fichierLa syntaxe de Razor n'a aucune signification dans le
.js
fichier et nous ne pouvons donc pas utiliser directement notre modèle dans un.js
fichier. Cependant, il existe une solution de contournement.1) La solution utilise des variables globales javascript .
Nous devons attribuer la valeur à une variable javascipt à portée globale, puis utiliser cette variable dans tous les blocs de code de vos fichiers
.cshtml
et.js
. La syntaxe serait doncAvec cela en place, nous pouvons utiliser les variables
userObj
et auuserJsonObj
fur et à mesure des besoins.Remarque: Personnellement, je ne suggère pas d'utiliser des variables globales car cela devient très difficile pour la maintenance. Cependant, si vous n'avez pas d'autre option, vous pouvez l'utiliser avec une convention de dénomination appropriée .. quelque chose comme
userAppDetails_global
.2) En utilisant la fonction () ou
closure
Envelopper tout le code qui dépend des données du modèle dans une fonction. Et puis exécutez cette fonction à partir du.cshtml
fichier.external.js
.cshtml
fichierRemarque: votre fichier externe doit être référencé avant le script ci-dessus. Sinon, la
userDataDependent
fonction n'est pas définie.Notez également que la fonction doit également avoir une portée globale. Donc, quelle que soit la solution, nous devons traiter avec des acteurs mondiaux.
la source
var model = @Html.Raw(Json.Encode(Model));
cela va créer un objet javascriptmodel
qui n'a aucun lien avec le modèle C # que vous passez à la vue. En fait, il n'y en aura pasModel
après le rendu de la vue. Ainsi, le formulaire dans l'interface utilisateur n'aura aucune idée des modifications des données d'objet javascript. Vous devez maintenant transmettre tout ce modèle modifié au contrôleur via AJAX, ou vous devez mettre à jour la valeur de vos contrôles d'entrée dans le formulaire en utilisant javascript.Although I did the same thing using hidden Html control and bound it to EventCommand and updated it's value in javascript. But wondering if could do same directly to model?
pour cette déclaration .. il n'y a pasEventCommand
de MVC, c'est pour les formulaires Web où il y a une connexion entre l'interface utilisateur et les actions du serveur, dans MVC, tout est séparé. Le seul moyen pour vous d'interagir avec le contrôleur est via AJAX, Soumettre un formulaire ou Demande de nouvelle page (recharger aussi)essayez ceci: (vous avez manqué les guillemets simples)
la source
JSON
sans guillemets vous donne unjavascript Object
. Vérifiez ma réponse dans le même fil pour plus de détails. stackoverflow.com/a/41312348/2592042Emballer la propriété du modèle autour des parens a fonctionné pour moi. Vous obtenez toujours le même problème avec Visual Studio se plaignant du point-virgule, mais cela fonctionne.
la source
Si l' erreur «ReferenceError: Model is not defined» est déclenchée, vous pouvez essayer d'utiliser la méthode suivante:
J'espère que cela t'aides...
la source
Je sais qu'il est trop tard mais cette solution fonctionne parfaitement pour le framework .net et le noyau .net:
@ System.Web.HttpUtility.JavaScriptStringEncode ()
la source