183 votes

Mélange de code Razor et Javascript

Je suis assez confus avec la façon de mélanger razor et js. Voici la fonction actuelle avec laquelle je suis coincé :

<script type="text/javascript">

        var data = [];

        @foreach (var r in Model.rows)
        {
                data.push([ @r.UnixTime * 1000, @r.Value ]);
        }

Si je pouvais déclarer du code c# avec <c#></c#> et que tout le reste était du code JS - ce serait ce que je cherche :

<script type="text/javascript">

        var data = [];

        <c#>@foreach (var r in Model.rows) {</c#>
                data.push([ <c#>@r.UnixTime</c#> * 1000, <c#>@r.Value</c#> ]);
        <c#>}</c#>

Quelle est la meilleure méthode pour y parvenir ?

2 votes

Apparemment, la coloration syntaxique est agréable et confuse avec mon <c#> tags également :-P

1 votes

Avez-vous vérifié la sortie HTML de cette vue ? Comment se présente-t-elle, et comment voulez-vous qu'elle soit différente ?

0 votes

Lance une erreur à propos de Conditional Compilation donc je ne peux pas voir le HTML - donc je crois qu'il sent qu'une partie de ceci est du code C#.

354voto

Max Toro Points 13050

Utilisez <text> :

<script type="text/javascript">

   var data = [];

   @foreach (var r in Model.rows)
   {
      <text>
            data.push([ @r.UnixTime * 1000, @r.Value ]);
      </text>
   }
</script>

29 votes

Razor fonctionne bien dans les blocs Javascript lorsqu'il est exécuté, mais je déteste la façon dont la coloration syntaxique s'embrouille. Il met en évidence tout le code Razor comme syntaxe invalide parce qu'il est coincé en mode Javascript, je crois.

2 votes

Qu'en est-il si ce code est dans un bundle ? puis-je écrire du code à l'intérieur d'un fichier javascript ?

3 votes

Cela fonctionne parfaitement jusqu'à ce que vous vouliez vérifier si une variable est inférieure à une autre et le rasoir devient fou !

86voto

SLaks Points 391154

À l'intérieur d'un bloc de code (ex, @foreach ), vous devez marquer la balise (ou, dans ce cas, le Javascript) avec @: ou le <text> étiquette .

À l'intérieur des contextes de balisage, vous devez entourer le code de blocs de code ( @{ ... } o @if , ...)

0 votes

Pourquoi dites-vous "marquer le balisage", ce ne serait pas un problème si le contenu était, en fait, du balisage.

2 votes

Max : Même si ça ne ressemble pas à du balisage, c'est du balisage. (Par opposition au code côté serveur)

0 votes

@: c'est ce que je cherchais, génial !

56voto

evc Points 109

Vous pouvez aussi simplement utiliser

<script type="text/javascript">

   var data = [];

   @foreach (var r in Model.rows)
   {
       @:data.push([ @r.UnixTime * 1000, @r.Value ]);
   }
</script>

note @ :

13voto

Mertuarez Points 205

Ne mélangez jamais plusieurs langues.

<script type="text/javascript">
    var data = @Json.Encode(Model); // !!!! export data !!!!

    for(var prop in data){
      console.log( prop + " "+ data[prop]);
    }

En cas de problème, vous pouvez également essayer

@Html.Raw(Json.Encode(Model));

2voto

Joel Wiklund Points 1173

Une méthode non conventionnelle pour séparer le javascript de la vue, tout en continuant à utiliser razor dans celle-ci, consiste à créer un fichier de type Scripts.cshtml et placez-y votre mélange javascript/razor.

Index.cshtml

<div id="Result">
</div>

<button id="btnLoad">Click me</button>

@section scripts
{
    @Html.Partial("Scripts")
}

scripts.cshtml

<script type="text/javascript">
    var url = "@Url.Action("Index", "Home")";

    $(document).ready(function() {
        $("#btnLoad").click(function() {
            $.ajax({
                type: "POST",
                url: url ,
                data: {someParameter: "some value"},
                contentType: "application/json; charset=utf-8",
                dataType: "json",

                success: function(msg) {
                    $("#Result").text(msg.d);
                }
            });
        });
    });
</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