2009-07-28 9 views
33

J'ai beaucoup travaillé avec ASP.NET MVC et Javascript/jQuery ces derniers temps et je semble me diriger dans une direction où je dois toujours passer une valeur dynamique "à" mon javascript. Lorsque le script est juste dans la page, je l'ai fait quelque chose comme ceci:Meilleures pratiques pour passer des données d'asp.net-mvc à javascript

var isEditable = <%=ViewData["editable"]%> 

J'aime comment cela est facile et rapide & comme j'injecter une valeur en HTML. Mais ça sent. Vraiment, vraiment mauvais. Et cela rompt l'intellisense et le formatage de code de Visual Studio, rendant mes scripts difficiles à lire et à comprendre.

Il m'a eu une autre solution serait de transmettre mes données à un champ caché, et avoir la référence Javascript que ...

<input type="hidden" id="editable" value="<%=ViewData["editable"]%>" /> 
var isEditable = $("#editable").attr("value"); 

Ceci est probablement beaucoup mieux car il conserve intact le script et me permettrait de le déplacer vers un fichier .js externe. Mais quelque chose à propos de cette solution ne semble pas idéal non plus. Ou est-ce juste moi?

Quelqu'un peut-il recommander des solutions & les meilleures pratiques pour transmettre des données dans vos scripts? Suis-je sur la mauvaise voie si mes scripts finissent par s'appuyer fortement sur les viewdata de mes contrôleurs?

+1

Que diriez-vous de "tirer" les données du modèle dans une sorte de magasin de données dans le contrôleur avec AJAX? – Janie

+1

Je pense que AJAX serait exagéré dans le type de cas dont je parle ... Mes scripts ont généralement juste besoin de connaître quelques bits de données du contrôleur/modèle (les données qui sont déjà présentes sur l'exécution de la page initiale) émettre un autre rappel de réseau un contrôleur semble un peu beaucoup. –

Répondre

11

Je passe parfois des données à mes pages en écrivant un objet de configuration à la page via un sérialiseur JSON:

var pageConfig = <%= ServerConfig.ToJson() %>; 

Si vous devez écrire la méthode toJSON vous. Cela maintient l'état de la page bien contenu, de sorte qu'il n'y a qu'un seul endroit où vous injecter des valeurs de serveur. Tout à partir de maintenant est purement javascript. Dans votre exemple, vous pouvez alors faire:

var isEditable = pageConfig.isEditable; 

même dans un fichier js externe, si pageConfig est mondiale. Dans ce cas, cependant, vous devriez correctement l'espace de noms: MY_APP.pageConfig peut-être.

+0

Cela n'affecte-t-il pas la capacité de chacheabilité?À tout le moins, chaque page GET peut renvoyer une page différente (configuration différente). Lorsque vous pensez en termes de caches dans les serveurs proxy, vous aurez maintenant une version différente de cette page pour chaque utilisateur. Est-ce une préoccupation du tout? –

+0

Ceci est une option intrigante, mais je ne suis pas sûr de comprendre exactement comment vous implémentez cette classe ServerConfig. En effet, chaque page GET peut renvoyer un ensemble de données différent, de sorte que pageConfig ne devrait finalement pas être défini à partir des ViewData de chaque page. Quoi qu'il en soit, vos autres suggestions sont quelque chose que je vais certainement essayer/considérer (Json et une variable js globale) - merci! –

+0

@Kurt - ouais, je pense que vous devriez le construire à partir de ViewData (peut-être comme un type anonyme). Je ne voulais pas dire que vous pouviez vous débarrasser de ViewData, mais que vous pouviez limiter le nombre d'endroits où vous injectez des données de serveur sur la page. –

0

Vous allez injecter cette information d'une manière ou d'une autre. Et OMI, votre premier exemple ne sont pas vraiment différents du second.

Une autre solution consiste à avoir une classe JS (ou prototype?) Qui acceptera un objet options. Bien que ce soit vrai, ce n'est pas vraiment différent des exemples que vous avez donnés. Mais encore, peut-être que vous voudriez aller de cette façon.

$(function() { 
    myClass.init({ isEditable: <%=ViewData["editable"]%>, 
     another: '<%=ViewData["another"]%>' }); 
}); 
0

Je pense que @ çağdaş fait un bon point, mais n'oubliez pas de vérifier le côté serveur aussi. Si vous définissez un champ sur "lecture seule", rien n'empêche l'utilisateur de modifier cet indicateur, de modifier un champ en lecture seule et de le soumettre.

0

Toute l'activité de Ajax est charger informations de manière asynchrone. Si vous faites le travail d'Ajax (charger l'info et la garder dans une variable), cela en enlève le pouvoir. Pourquoi ne pas essayer JQuery et utiliser son Ajax, ou Obtenir des fonctions pour charger le contenu dynamiquement. Cela aiderait votre page à se charger plus rapidement.

Questions connexes