Timmi4sa - Я согласен, нет особого ответа на вопрос, почему мы получаем эту ошибку. Наконец-то я стал на шаг ближе к пониманию всего этого, поэтому я решил поделиться.
Условная компиляция определяется моим MS следующим образом:
Условная компиляция позволяет JScript использовать новые функции языка
без ущерба для совместимости со старыми версиями, которые не
поддерживать функции. Некоторые типичные применения для условной компиляции
включать использование новых функций в JScript, встраивание поддержки отладки
в сценарий и отслеживание выполнения кода.
Из того, что я могу сказать, мы действительно говорим о функции VS. Моя текущая догадка такова: VS позволяет вам отлаживать JS, но он должен знать, что такое JS, чтобы отлаживать его. По умолчанию условная компиляция отключена - я предполагаю, что это связано с дополнительными издержками. То, что мы делаем, когда используем @Model ... в JS, делает именно то, что говорится в предупреждении (более или менее) - создавая условный JS. В конечном итоге JS - это разные вещи, в зависимости от значения наших переменных C # / VB.
Согласно MS решение состоит в том, чтобы включить условную компиляцию, как указано выше, с помощью оператора:
/*@cc_on @*/
Хотя я склонен быть немного анальным и предпочитаю избегать предупреждений, я могу просто проигнорировать это, если только кто-то не сможет объяснить мне, почему это плохая идея).
Если вы действительно хотите, чтобы ошибка исчезла, и вам не нравится флаг условной компиляции, вы можете заключить вызов кода C # / VB в двойные кавычки, как показано ниже. Но это кажется грязным и работает только потому, что JS свободно набирается ... (в любом случае, с числовыми типами у строк не должно быть проблем ... независимо от того, что это кажется хакерским)
"@Model.Items.Count()"
Редактировать: Я пошел и провел немного больше исследований ... Мне еще меньше понравилась идея CC после прочтения этой статьи: http://www.javascriptkit.com/javatutors/conditionalcompile.shtml. Думаю, я просто проигнорирую это предупреждение.
Я надеюсь, что это поможет объяснить некоторые тайны.
РЕДАКТИРОВАТЬ:
Другой вариант - сбросить HiddenFor в форме, присвоить ему Id, а затем заполнить переменную JS из этого поля (jQuery делает это довольно легко). Это то, что я сделал в настоящее время. Это исключает предупреждения, и я часто хочу сравнить переменную JS с исходным полем VMC. Для тех из вас, кому это нужно:
@* Somewhere in your form - assuming a strongly typed view *@
@Html.HiddenFor(x => x.YourField, new { id = "SomethingMeaningful" })
// and then in your JS
$(document).ready(function(){
...
var jsYourField = $("#SomethingMeaningful").val();
...
});
Обратите внимание, что переменная JS и переменные MVC не всегда «выстраиваются в линию» точно, поэтому вам может потребоваться выполнить некоторую приведение или дополнительную работу при копировании значения переменной в JS.