Possibilité d’accéder à l’object MVC ViewBag à partir d’un fichier Javascript?

Est-il possible de faire les choses suivantes à partir d’un fichier javascript dans une application MVC?

$(function(){ alert(@ViewBag.someValue); } 

Actuellement, l’erreur est générée:

référence à un nom XML indéfini @ViewBag

Je ne crois pas qu’il existe actuellement un moyen de le faire. Le moteur Razor n’parsing pas les fichiers Javascript, mais uniquement les vues Razor. Cependant, vous pouvez accomplir ce que vous voulez en définissant les variables dans votre vue Razor:

    

Comme Joe le fait remarquer dans les commentaires, la valeur de chaîne ci-dessus se brisera s’il y a un seul devis. Si vous voulez que ce soit complètement insipide, vous devrez remplacer tous les guillemets simples par des guillemets simples échappés. Le problème est que toutes les coupures soudaines deviennent un problème. Par exemple, si votre chaîne est ” foo \' bar “, et que vous remplacez le guillemet simple, ce qui sortira sera ” foo \\' bar “, et vous revenez au même problème. (Il s’agit de la vieille difficulté de l’encodage en chaîne.) La meilleure façon de gérer cela est de traiter les barres obliques et les guillemets comme des objects spéciaux et de s’assurer qu’ils sont tous protégés:

  @{ var safeSsortingngValue = ViewBag.someSsortingngValue .Replace("\\", "\\\\") .Replace("'", "\\'"); } var someSsortingngValue = '@(safeSsortingngValue)'; 

Pas dans un fichier JavaScript, non.
Votre fichier JavaScript peut contenir une classe et vous pouvez instancier une nouvelle instance de cette classe dans la vue, puis transmettre les valeurs ViewBag au constructeur de la classe.

Ou, si ce n’est pas une classe, votre seule autre solution consiste à utiliser data atsortingbuts de data dans vos éléments HTML, à les atsortingbuer aux propriétés de votre View et à les récupérer dans le fichier JS.

En supposant que vous avez eu cette entrée:

  

Ensuite, dans votre fichier JS, vous pouvez l’obtenir en utilisant:

 var myVal = $("#myInput").data("myValue"); 

en HTML:

  

dans Script:

 var customVal = $("#customInput").data("value"); 

Pour ce faire, votre fichier JavaScript doit être prétraité côté serveur. Essentiellement, cela devrait devenir une vue ASP.NET de quelque sorte, et les balises de script qui font référence au fichier feraient essentiellement référence à une action de contrôleur qui répond à cette vue.

Cela ressemble à une boîte de Pandore que vous ne voulez pas ouvrir.

Puisque JavaScript est côté client, pourquoi ne pas simplement définir la valeur d’un élément côté client et faire en sorte que JavaScript interagisse avec cela. C’est peut-être une étape supplémentaire de l’indirection, mais cela ne semble pas être un casse-tête que de créer une vue JavaScript.

Quelque chose comme ça:

  

Le fichier JavaScript externe peut alors référencer la variable JavaScript someValue dans la scope de ce document.

Ou même:

  

Ensuite, vous pouvez accéder à cette entrée cachée.

A moins que vous ne trouviez un moyen vraiment efficace de rendre votre fichier JavaScript utilisable en tant que vue. C’est certainement faisable, et je ne peux pas facilement penser à des problèmes que vous auriez (autre que du code de vue vraiment moche car le moteur de vue deviendrait très confus quant à ce que JavaScript et à quoi Razor … alors attendez-vous une tonne de balisage), alors si vous trouvez un moyen astucieux de le faire, ce serait plutôt cool, mais peut-être pas intuitif pour quelqu’un qui doit supporter le code plus tard.

J’ai remarqué que le détecteur d’erreur intégré de Visual Studio est un peu bizarre si vous essayez de le faire:

 var intvar = @(ViewBag.someNumericValue); 

Parce que @ (ViewBag.someNumericValue) a le potentiel de ne rien évaluer, le code JavaScript suivant erroné pourrait être généré:

 var intvar = ; 

Si vous êtes certain que someNemericValue sera défini sur un type de données numérique valide, vous pouvez éviter les avertissements de Visual Studio en procédant comme suit:

 var intvar = Number(@(ViewBag.someNumericValue)); 

Cela peut générer l’exemple suivant:

 var intvar = Number(25.4); 

Et cela fonctionne pour les nombres négatifs. Si l’élément n’est pas dans votre sac, Number () est évalué à 0.

Plus d’avertissements Visual Studio! Mais assurez-vous que la valeur est définie et numérique, sinon vous ouvrez la porte à d’éventuelles attaques par injection JavaScript ou à des erreurs d’exécution.

Utilisez ce code dans votre fichier .cshtml.

  @{ var jss = new System.Web.Script.Serialization.JavaScriptSerializer(); var val = jss.Serialize(ViewBag.somevalue); }  

Créez une vue et retournez-la en tant que vue partielle:

 public class AssetsController : Controller { protected void SetMIME(ssortingng mimeType) { this.Response.AddHeader("Content-Type", mimeType); this.Response.ContentType = mimeType; } // this will render a view as a Javascript file public ActionResult GlobalJS() { this.SetMIME("text/javascript"); return PartialView(); } } 

Ensuite, dans la vue GlobalJS, ajoutez le code javascript comme (en ajoutant le // cela fera que le studio visual intellisense le lira comme un script java)

 // 

Ensuite, dans votre vue finale, vous pouvez append une référence au javascript comme ceci.

  

Ensuite, dans votre contrôleur de vue finale, vous pouvez créer / transmettre vos ViewBags et les afficher dans votre javascript.

 public class MyFinalViewController : Controller { public ActionResult Index() { ViewBag.PropertyName = "My ViewBag value!"; return View(); } } 

J’espère que cela aide.

Dans l’action des contrôleurs, ajoutez:

  public ActionResult Index() { try { int a, b, c; a = 2; b = 2; c = a / b; ViewBag.ShowMessage = false; } catch (Exception e) { ViewBag.ShowMessage = true; ViewBag.data = e.Message.ToSsortingng(); } return View(); // return View(); } in Index.cshtml Place at the bottom:  @if (ViewBag.ShowMessage) {  
Some Message here
}