web-dev-qa-db-fra.com

Syntaxe de rasoir et Javascript

À titre de test, je convertis une application de validation de principe que nous avons écrite à partir de Web Forms vers Razor, simplement pour que nous puissions l'évaluer.

J'ai rencontré un problème jusqu'à présent qui me fait mal à la tête ... générer du Javascript côté client ...

Formulaires Web

<script type="text/javascript">
    var jqGridIdList = "<%: Url.Action ("getidlist", "office", new { area = "reports" }) %>";

    var availableIds = [];
    <% for (var i = 0; i < Model.Data.Count (); i++) { %>
    availableIds.Push({ value : "<%: Model.Data.ElementAt (i).Text %>", label : "<%: Model.Data.ElementAt (i).Text %>" });
    <% } %>
</script>

Syntaxe de rasoir

<script type="text/javascript">
    var jqGridIdList = "@Url.Action("getidlist", "office", new { area = "reports" })";

    var availableIds = [];
    @for(var i = 0; i < Model.Data.Count (); i++) {
    availableIds.Push({ value : "@Model.Data.ElementAt(i).Text", label : "@Model.Data.ElementAt(i).Text" });
    }
</script>

Le compilateur me donne l'erreur suivante sur la ligne 'availableIds.Push':

Message d'erreur du compilateur: CS1525: terme d'expression non valide "{"

Il essaie évidemment de le compiler en C # ... mais comment puis-je l'arrêter?

Merci,
Kieron

54
Kieron

Vous devez l'envelopper dans le pseudo-élément <text>. Cela ramènera l'analyseur en mode html et il analysera ensuite le javascript dans le cadre du html et non pas c #. La raison pour laquelle cela se produit est que la @for() est un bloc c # et tout ce qui est traité à l'intérieur est également considéré comme c # jusqu'à ce qu'il soit échappé par une balise html. Puisque vous ne voulez probablement pas de rasoir de balises html, la balise <text> Permet de changer de mode.

Si vous remarquez la différence dans vos formulaires Web asp.net, vous terminez la ligne <% for Par un %> Qui la sort du mode c #. Si vous téléchargez l'extension de surligneur de rasoir pour Visual Studio 2010, cela vous aidera à voir quand le code est traité comme du code et le HTML est traité comme du HTML.

<script type="text/javascript">
    var jqGridIdList = "@Url.Action("getidlist", "office", new { area = "reports" })";

    var availableIds = [];
    @for(var i = 0; i < Model.Data.Count (); i++) {
        <text>availableIds.Push({ value : "@Model.Data.ElementAt(i).Text", label : "@Model.Data.ElementAt(i).Text" });</text>
    }
</script>

Mise à jour pour la dernière version

Vous pouvez désormais utiliser la syntaxe @: Pour encore plus de lisibilité

<script type="text/javascript">
    var jqGridIdList = "@Url.Action("getidlist", "office", new { area = "reports" })";

    var availableIds = [];
    @for(var i = 0; i < Model.Data.Count (); i++) {
        @:availableIds.Push({ value : "@Model.Data.ElementAt(i).Text", label : "@Model.Data.ElementAt(i).Text" });
    }
</script>
96
Buildstarted