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

Условная компиляция отключена в Razor?

У меня есть цикл С# foreach, который выводит некоторый javascript для инициализации некоторых индикаторов выполнения на моем бритвенном представлении.

@foreach (var item3 in Model)
{
    @:$("#[email protected]").wijprogressbar({ value: @((item3.TotalRedeemed / item3.TotalSold) * 100), fillDirection: "east" });

}

Проблема, с которой я сталкиваюсь, - это визуальная студия, сообщающая, что "Условная компиляция отключена" в цикле foreach, а малый расчет значения всегда выводится как 0, несмотря на то, что TotalRedeemed и TotalSold имеют значения. Я правильно использую оператор @:? Благодарим за помощь.

Я пробовал оба предложения до сих пор, и это то, что у меня есть сейчас:

 @foreach (var item3 in Model)
 {

     var percentage = (item3.TotalRedeemed / item3.TotalSold) * 100;

     <text>$("#[email protected]").wijprogressbar({ value: @percentage, fillDirection: "east" });</text>

 }

процент выводится как 0, но TotalRedeemed и TotalSold имеют значения, поскольку они печатаются в представлении до того, как это вызвано. Есть ли способ установить точку останова на моем представлении, чтобы узнать, какой процент до его распечатки?

4b9b3361

Ответ 1

Добавьте /*@cc_on @*/ в свой код.

Обновление: Обнаружено, почему они могут быть 0:

item3.TotalRedeemed и item3.TotalSold должны быть float или double. Если они int, то он выходит на 0.

Ответ 2

Timmi4sa - Я согласен с тем, что ответа на вопрос о том, почему мы получаем эту ошибку, не так много. Я, наконец, приблизился к пониманию всего этого, поэтому я думал, что поделюсь.

Условная компиляция определяется как MS:

Условная компиляция позволяет JScript использовать новые языковые функции не жертвуя совместимостью со старыми версиями, которые не поддерживайте функции. Некоторые типичные применения для условной компиляции включить использование новых функций в JScript, внедрение поддержки отладки в script и выполнение трассировочного кода.

Из того, что я могу сказать, мы действительно говорим об особенности VS. Мое последнее предположение: VS позволяет отлаживать JS, но он должен знать, что JS для его отладки. По умолчанию Условная компиляция отключена - я предполагаю, что есть некоторые дополнительные накладные расходы. То, что мы делаем, когда мы используем @Model... в JS, делает именно то, что предупреждает состояние (более или менее) - создание условного JS. JS попадает в разные вещи в зависимости от значения наших переменных С#/VB.

Согласно MS, решение состоит в том, чтобы включить условную компиляцию, как указано выше, с помощью инструкции:

/*@cc_on @*/

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

Если вы действительно хотите, чтобы ошибка исчезла и не нравится флаг "Условная компиляция", вы можете обернуть вызов кода С#/VB в двойные кавычки, как показано ниже. Но это чувствует себя грязным и работает только потому, что JS свободно набирается... (ну, в любом случае, для строк не должно быть проблем... независимо от того, что это кажется хакерским)

"@Model.Items.Count()"

Редактирование: я пошел и сделал еще немного исследований... Мне нравится идея CC еще меньше после того, как перечеркнула эту статью: http://www.javascriptkit.com/javatutors/conditionalcompile.shtml. Я думаю, что я просто проигнорирую это предупреждение.

Я надеюсь, что это поможет объяснить некоторые загадки.

EDIT:

Другой вариант - бросить в форму HiddenFor down, дать ему 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.

Ответ 3

Попробуйте следующее:

@foreach (var item3 in Model)
{
    <text>$("#[email protected]").wijprogressbar({ 
        value: @((item2.TotalRedeemed / item2.TotalSold) * 100), 
        fillDirection: "east" 
    });</text>

}

Но лучше использовать этот расчет для свойства модели вида, чтобы ваше представление выглядело так:

@foreach (var item in Model)
{
    <text>$('#[email protected](item.ID)').wijprogressbar({ 
        value: @item.SoldPercentage, 
        fillDirection: "east" 
    });</text>
}

Ответ 4

Я думал, что поделюсь тем, что сработало для меня,

У меня была эта же проблема: System.Web.HttpCompileException(0x80004005)

ниже исключения, которое я получаю: Имя "Url" не существует

Когда я посмотрел на представление, я заметил, что единственным местом, использующим Url, был код бритвы @Url.

В этом сообщении говорилось о ссылках на бритву и MVC.

Когда я смотрел в папке Views в решении, был файл web.config, содержащий все ссылки, однако он был переименован в web.src.config. Как только я изменил его на web.config, я снова и снова работал.