2010-12-13 22 views
3

Existe-t-il un moyen de transmettre les données du modèle au javascript externe sans avoir de variables cachées dans ma vue. J'utilise Google map pour afficher les punaises et la carte est chargée via javascript et en même temps j'ai une (grande) liste d'informations de latitude et de longitude dans le cadre de mes données de modèle qui sont récupérées lors de ma demande. Je ne veux pas avoir une longue liste de variables cachées dans mon HTML et aussi réduire un autre appel ajax au serveur pour aller chercher l'information requise (lat/lon) dans mon javascript. Y a-t-il un moyen de le faire efficacement?Transmission des données du modèle au javascript externe

Merci.

Répondre

0

La réponse courte est "non".

Si vous devez renvoyer un modèle de données brutes à côté de votre vue, la seule option consiste à incorporer les données dans la vue. Les deux options sont:

Dans un élément HTML (type de l'OMI maladroite):

<div id="myData" data-model="{&quot;Name&quot;: &quot;Jason&quot;}"></div> 

dans le script:

<script> 
    var myData = {Name: Jason}; 
</script> 

Je préfère la deuxième méthode car il n'y a pas de HTML échapper. Je suis d'accord que c'est un peu ennuyeux d'avoir à faire cela, mais une demande est une demande ... c'est juste un flux de données. Bootstrap de données de cette façon est assez commun, alors peut-être une version future de MVC aura un moyen plus propre de le retourner (mais il ressemblerait probablement à l'un de mes exemples ci-dessus). En dehors de cela, comme vous l'avez mentionné, vous pouvez faire une requête supplémentaire pour recevoir uniquement le modèle dans une réponse JSON.

EDIT:

J'ai eu un HtmlHelper ma manche pour aider à cette ...

public static MvcHtmlString ToScriptVariable<T, TMember>(this T value, Expression<Func<T, TMember>> expression) where T : class 
{ 
    var member = expression.Body as MemberExpression; 
    if (member == null) 
     throw new ArgumentException("Expression must be a member expression.", "expression"); 

    var expressionValue = expression.Compile()(value); 
    var serializer = new JavaScriptSerializer(); 
    var seralizedData = serializer.Serialize(expressionValue); 

    var tag = new TagBuilder("script"); 
    tag.Attributes.Add("type", "text/javascript"); 
    tag.InnerHtml = String.Format(CultureInfo.InvariantCulture, "var {0} = {1};", member.Member.Name, seralizedData); 

    return MvcHtmlString.Create(tag.ToString(TagRenderMode.Normal)); 
} 

Utilisation:

<%: Html.ToScriptVariable(x => Model.MyData) %> 

Résultat:

<script type="text/javascript">var MyData = "(whatever)"</script> 
+0

Il y a un re deux autres option cocher [this] (https://forums.asp.net/t/2036219.aspx?How+to+pass+model+data+to+javascript+file+) et [this] (https: // blog.mariusschulz.com/2014/02/05/passing-net-server-side-data-to-javascript). J'espère aider quelqu'un. – stom