4 votes

Passer les données du modèle à un javascript externe

Existe-t-il un moyen de transmettre les données du modèle à un javascript externe sans avoir de variables cachées dans ma vue ? J'utilise Google map pour afficher des punaises et la carte est chargée via javascript. En même temps, j'ai une (grande) liste d'informations sur la latitude et la longitude qui font partie des données de mon modèle et qui sont récupérées lors de ma requête. Je ne veux pas avoir une longue liste de variables cachées dans mon html et aussi réduire un appel ajax supplémentaire au serveur pour récupérer les informations requises (lat/lon) dans mon javascript. Existe-t-il un moyen de faire cela efficacement ?

Merci.

1voto

albb Points 316

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 est d'intégrer les données dans la vue. Les deux options sont les suivantes :

Dans un élément HTML (ce qui est plutôt gênant pour l'IMO) :

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

Dans script :

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

Je préfère la deuxième méthode car il n'y a pas d'échappement HTML.

Je suis d'accord pour dire que c'est un peu ennuyeux de devoir faire ça, mais une demande est une demande... c'est juste un flux de données. Le bootstrapping de données de cette manière est assez commun, donc peut-être qu'une future version de MVC aura une manière plus propre de le retourner (mais cela ressemblerait probablement à un de mes exemples ci-dessus).

En dehors de cela, comme vous l'avez mentionné, vous pouvez faire une demande supplémentaire pour recevoir uniquement le modèle dans une réponse JSON.

EDITAR:

J'avais un HtmlHelper dans ma manche pour aider avec ça...

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>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X