Mix Razor и код Javascript

Я довольно смущен тем, как смешивать бритву и js. Это текущая функция, за которой я застрял:

<script type="text/javascript">

        var data = [];

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

Если бы я мог объявить код С# с <c#></c#>, и все остальное было JS-кодом - это было бы то, что я хочу:

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

Каков наилучший способ достижения этого?

Ответ 1

Используйте <text>:

<script type="text/javascript">

   var data = [];

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

Ответ 2

Внутри кодового блока (например, @foreach) вам нужно пометить разметку (или, в данном случае, Javascript) с помощью @: или тег <text>.

Внутри контекстов разметки вам необходимо окружить код блоками кода (@{ ... } или @if,...)

Ответ 3

вы также можете просто использовать

<script type="text/javascript">

   var data = [];

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

note @:

Ответ 4

Никогда не смешивайте больше языков.

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

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

Ответ 5

Оберните свой код Razor в @{}, когда внутри JS script, и имейте в виду использование только @ Иногда это не работает:

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

Это приведет к созданию

function hideSurveyReminder() {
       False = true;
    }

в браузере = (