Mischen Sie Rasiermesser- und Javascript-Code


171

Ich bin ziemlich verwirrt, wie man Rasiermesser und js mischt. Dies ist die aktuelle Funktion, an der ich festhalte:

<script type="text/javascript">

        var data = [];

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

Wenn ich c # -Code mit deklarieren könnte <c#></c#>und alles andere JS-Code wäre, wäre dies das, wonach ich suche:

<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#>

Was ist die beste Methode, um dies zu erreichen?


2
Anscheinend ist die Syntaxhervorhebung nett und auch mit meinen <c#>Tags verwechselt :-P
Kyle Brandt

1
Haben Sie die HTML-Ausgabe dieser Ansicht überprüft? Wie sieht es aus und wie soll es sich unterscheiden?
Sukru

Wirft einen Fehler auf, Conditional Compilation sodass ich den HTML-Code nicht sehen kann. Ich glaube, es ist ein Teil davon, dass es sich um C # -Code handelt.
Kyle Brandt

1
Es scheint ein JavaScript-Fehler zu sein: webdeveloper.com/forum/showthread.php?t=99780 . Was ist die genaue Fehlermeldung und woher bekommen Sie sie?
Sukru

2
Ich denke, dies ist ein Fall, in dem der Versuch, JS und C # so eng zu mischen, ein Problem beim Lesen / Aufrechterhalten wäre. Ich bin froh, dass der Compiler Sie von diesem Code ausgeschlossen hat. :)
Jim Bolla

Antworten:


332

Verwendung <text>:

<script type="text/javascript">

   var data = [];

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

27
Razor funktioniert gut in Javascript-Blöcken, wenn es ausgeführt wird, aber ich hasse es, wenn die Syntaxhervorhebung allerlei verwirrt wird. Es hebt den gesamten Razor-Code als ungültige Syntax hervor, da er meiner Meinung nach im Javascript-Modus steckt.
Chev

2
Was ist, wenn dieser Code in einem Bundle ist? Kann ich Code in eine Javascript-Datei schreiben?
Ncubica

2
Funktioniert perfekt, bis Sie überprüfen möchten, ob eine Variable kleiner als eine andere ist und das Rasiermesser psychisch wird!
cbp

1
@ncubica Wenn Sie Rasiermesser im Bündel wollen, dann ist etwas in Ihrem Konzept falsch. Rasiermesser ist für Ansichten, nicht Javascript.
100r

1
@ncubica Dieser Beitrag ist alt, aber die Lösung für Ihre Frage lautet: Schreiben Sie eine Funktion in eine JS-Datei, rendern Sie sie mit Scripts.Renderund rufen Sie die Funktion in einem <script>Tag auf. Nicht gerade anmutig, aber es funktioniert für die meisten (sprich: einfachen) Anwendungsfälle.
Sinjai

81

Innerhalb eines Codeblocks (z. B. @foreach) müssen Sie das Markup (oder in diesem Fall Javascript) mit @:oder das <text>Tag markieren .

Innerhalb der Markup-Kontexte müssen Sie Code mit Codeblöcken umgeben ( @{ ... }oder @if, ...)


Warum sagst du "Markup markieren", dies wäre kein Problem, wenn der Inhalt tatsächlich Markup wäre.
Max Toro

1
@ Max: Auch wenn es nicht nach Markup aussieht, ist es Markup. (Im Gegensatz zu serverseitigem Code)
SLaks

@:ist das, wonach ich gesucht habe, großartig!
Muflix

53

Sie können auch einfach verwenden

<script type="text/javascript">

   var data = [];

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

note @:


12

Mischen Sie niemals mehr Sprachen.

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

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

Im Falle eines Problems können Sie es auch versuchen

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

Das ist großartig, aber es gibt auch legitime Fälle, in denen wir mischen müssen. Aber das ist die Lösung, die ich verwendet habe, da sie perfekt passt.
frostymarvelous

3
Beachten Sie, dass dies ist Sprachen zu vermischen. Sie haben eine Anweisung, die halb aus JavaScript ("var data =") und halb aus Razor / C # ("@ Json.Encode (Model)") besteht. Es ist nur ein weniger invasives Mischen, aber es ist nicht weniger Mischen als ein Razor / C # "foreach", dessen Körper generiertes JavaScript emittiert. :-)
Jonathan Gilbert

3
Es kehrt zurück, Uncaught SyntaxError: Unexpected token &weil das Modell so etwas wird[{&quot;Id&quot;:1,&quot;Name&quot;:&quot;Name}]
Weihui Guo

1

Eine nicht konventionelle Methode, um Javascript von der Ansicht zu trennen, aber dennoch Rasiermesser zu verwenden, besteht darin, eine Scripts.cshtmlDatei zu erstellen und Ihr gemischtes Javascript / Rasiermesser dort abzulegen.

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>


-1

Wickeln Sie Ihren Razor-Code in @ {} ein, wenn Sie sich im JS-Skript befinden, und achten Sie darauf, nur @ zu verwenden. Manchmal funktioniert es nicht:

function hideSurveyReminder() {
       @Session["_isSurveyPassed"] = true;
    }

Dies wird produzieren

function hideSurveyReminder() {
       False = true;
    }

im Browser = (

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.