Подтвердить что ты не робот

Как установить переменные javascript с помощью MVC4 с помощью Razor

Может кто-то отформатировать код ниже, чтобы я мог установить переменные srcript с кодом С# с помощью бритвы?

Ниже не работает, у меня есть такой способ сделать, чтобы кто-то помог.

@{int proID = 123; int nonProID = 456;}

<script type="text/javascript">
    @{

     <text>  

    var nonID [email protected];
    var proID= @proID;
    window.nonID = @nonProID;
    [email protected];

    </text>
}
</script>

Я получаю ошибку времени разработки

enter image description here

4b9b3361

Ответ 1

Вы должны взглянуть на результат, который выводит ваша страница бритвы. На самом деле вам нужно знать, что выполняется server-side и client-side. Попробуйте следующее:

@{
    int proID = 123; 
    int nonProID = 456;
}

<script>

    var nonID = @nonProID;
    var proID = @proID;
    window.nonID = @nonProID;
    window.proID = @proID;

</script>

Выход должен быть таким:

enter image description here

В зависимости от того, какую версию Visual Studio вы используете, она указывает некоторые моменты времени разработки для просмотров с бритвой.

Ответ 2

Вот как я решил проблему:

@{int proID = 123; int nonProID = 456;}

<script type="text/javascript">
var nonID = Number(@nonProID);
var proID = Number(@proID);
</script>

Он самодокументирован и не включает преобразование в текст и из него.


Примечание. Будьте осторожны, чтобы использовать функцию Number() не создавать объекты new Number() - так как оператор точно равен нулю может вести себя неочевидным образом:

var y = new Number(123); // Note incorrect usage of "new"
var x = new Number(123);
alert(y === 123); // displays false
alert(x == y); // displays false

Ответ 3

Так как ошибки синтаксиса бритвы могут стать проблематичными, пока вы работаете над представлением, я полностью понимаю, почему вы хотите их избежать. Здесь пара других вариантов.

<script type="text/javascript">
    // @Model.Count is an int
    var count = '@Model.Count';
    var countInt = parseInt('@Model.ActiveLocsCount');
</script>

Котировки действуют как разделители, поэтому анализатор бритвы счастлив. Но, конечно, ваш С# int становится строкой JS в первом выражении. Для пуристов второй вариант может быть лучше.

Если у кого-то есть лучший способ сделать это без ошибок синтаксиса бритвы, в частности, сохранения типа var, я бы хотел его увидеть!

Ответ 4

Я видел несколько подходов к работе над ошибкой, и я провел некоторые тесты времени, чтобы увидеть, что работает для скорости (http://jsfiddle.net/5dwwy/)

Подходы:

  • Прямое назначение

    В этом подходе синтаксис бритвы непосредственно присваивается переменной. Это то, что выдает ошибку. Как базовый уровень, тест скорости JavaScript просто выполняет прямое присвоение числа переменной.

  • Пропустить конструктор `Number`

    В этом подходе мы завершаем синтаксис бритвы при вызове конструктора `Number`, как в` Number (@ViewBag.Value) `.

  • ParseInt

    В этом подходе синтаксис бритвы помещается внутри кавычек и передается функции `parseInt`.

  • Функция возврата значения

    В этом подходе создается функция, которая просто берет синтаксис бритвы как параметр и возвращает ее.

  • Функция проверки типов

    В этом подходе функция выполняет некоторую проверку базового типа (ищет нуль, в основном) и возвращает значение, если оно не является нулевым.

Процедура:

Используя каждый подход, упомянутый выше, a for-loop повторяет каждый вызов функции 10M раз, получая общее время для всего цикла. Затем этот цикл повторяется 30 раз, чтобы получить среднее время на 10 М действий. Эти времена затем сравнивались друг с другом, чтобы определить, какие действия были быстрее других.

Обратите внимание, что поскольку он работает JavaScript, фактические числа, получаемые другими людьми, будут отличаться, но важность не в фактическом числе, а в том, как числа сравниваются с другими номерами.

Результаты:

Используя подход прямого назначения, среднее время обработки 10M-присвоений составляло 98,03 мс. Использование конструктора Number дало 1554,93 мс на 10 М. Аналогично, метод parseInt занял 1404,27 мс. Два вызова функций потребовали 97,5 мс для простой функции и 101,4 мс для более сложной функции.

Выводы:

Самый чистый код для понимания - это прямое назначение. Однако из-за ошибки в Visual Studio это сообщает об ошибке и может вызвать проблемы с Intellisense и дать смутное чувство неправильности.

Самый быстрый код был простым вызовом функции, но только с небольшим отрывом. Поскольку я не проводил дальнейшего анализа, я не знаю, имеет ли это различие статистическое значение. Функция проверки типов также была очень быстрой, только немного медленнее, чем прямое назначение, и включает возможность того, что переменная может быть нулевой. Это не очень практично, потому что даже базовая функция вернет undefined, если параметр undefined (null в синтаксисе бритвы).

Анализ значения бритвы как int и запуск его через конструктор были чрезвычайно медленными, примерно в 15 раз медленнее прямого назначения. Скорее всего, конструктор Number фактически внутренне вызывает parseInt, что объясняет, почему это занимает больше времени, чем простой parseInt. Тем не менее, у них есть преимущество в том, что они более значимы, не требуя выполнения внешней функции (то есть где-то еще в файле или приложении), при этом конструктор Number фактически минимизирует видимое литье целого числа в строку.

В нижней строке эти числа были сгенерированы с помощью итераций 10M. На одном объекте скорость невыразимо мала. Для большинства просто запустить его через конструктор Number может быть самым читаемым кодом, несмотря на то, что он является самым медленным.

Ответ 5

@{
int proID = 123; 
int nonProID = 456;
}

<script>

var nonID = '@nonProID';
var proID = '@proID';
window.nonID = '@nonProID';
window.proID = '@proID';

</script>

Ответ 6

Не столько ответ, сколько предостерегающий рассказ: это тоже подшучивало - и я подумал, что у меня есть решение, предварительно ожидая нуля и используя синтаксис @(...). т.е. ваш код был бы:

var nonID = [email protected](nonProID);
var proID = [email protected](proID);

Получение вывода, например:

var nonId = 0123;

То, что я не понимал, это то, что JavaScript (версия 3) представляет восьмеричные/базовые 8 номера и фактически изменяет значение. Кроме того, если вы используете команду "use strict";, тогда она полностью разрушит ваш код, когда будут удалены восьмеричные числа.

Я все еще ищу подходящее решение.

Ответ 7

Он работает, если вы делаете что-то вроде этого:

var proID = @proID + 0;

Что создает код, который выглядит примерно так:

var proID = 4 + 0;

Немного странно, но не более фальшивых синтаксических ошибок. К сожалению, ошибки все еще сообщаются в VS2013, поэтому это не было должным образом адресовано (пока).

Ответ 8

Я рассматривал этот подход:

function getServerObject(serverObject) {
  if (typeof serverObject === "undefined") {
    return null;
  }
  return serverObject;
}

var itCameFromDotNet = getServerObject(@dotNetObject);

Мне кажется, что это делает его более безопасным на стороне JS... В худшем случае вы получите нулевую переменную.

Ответ 9

Я нашел очень чистое решение, которое позволяет отделить логику и графический интерфейс:

на своей странице бритвы .cshtml попробуйте это:

<body id="myId" data-my-variable="myValue">

...your page code here

</body>

в вашем файле .js или .ts (если вы используете typeScript), чтобы прочитать сохраненное значение из вашего представления, добавьте что-то вроде этого (требуется библиотека jquery):

$("#myId").data("my-variable")

Ответ 10

Один из простых способов:

<input type="hidden" id="SaleDateValue" value="@ViewBag.SaleDate" />
<input type="hidden" id="VoidItem" value="@Model.SecurityControl["VoidItem"].ToString()" />

И затем получите значение в javascript:

var SaleDate = document.getElementById('SaleDateValue').value;
var Item = document.getElementById('VoidItem').value;

Ответ 11

Я использую очень простой function для решения синтаксических ошибок в теле JavaScript кодов, которые смешиваются с Razor кодами ;)

function n(num){return num;}

var nonID = n(@nonProID);
var proID= n(@proID);

Ответ 12

Это должно охватывать все основные типы:

public class ViewBagUtils
{
    public static string ToJavascriptValue(dynamic val)
    {
        if (val == null) return "null";
        if (val is string) return val;
        if (val is bool) return val.ToString().ToLower();
        if (val is DateTime) return val.ToString();
        if (double.TryParse(val.ToString(), out double dval)) return dval.ToString();

        throw new ArgumentException("Could not convert value.");
    }
}

И в вашем файле .cshtml внутри тега <script>:

@using Namespace_Of_ViewBagUtils
const someValue = @ViewBagUtils.ToJavascriptValue(ViewBag.SomeValue);

Обратите внимание, что для строковых значений вам придется использовать выражение @ViewBagUtils внутри одинарных (или двойных) кавычек, например:

const someValue = "@ViewBagUtils.ToJavascriptValue(ViewBag.SomeValue)";

Ответ 13

Это устанавливает JavaScript-переменную для меня непосредственно из определения app.etting, определенного в web.config.

var pv = '@System.Web.Configuration.WebConfigurationManager.AppSettings["pv"]';