Ответ 1
Добавьте /*@cc_on @*/
в свой код.
Обновление: Обнаружено, почему они могут быть 0
:
item3.TotalRedeemed
и item3.TotalSold
должны быть float
или double
. Если они int
, то он выходит на 0
.
У меня есть цикл С# 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 имеют значения, поскольку они печатаются в представлении до того, как это вызвано. Есть ли способ установить точку останова на моем представлении, чтобы узнать, какой процент до его распечатки?
Добавьте /*@cc_on @*/
в свой код.
Обновление: Обнаружено, почему они могут быть 0
:
item3.TotalRedeemed
и item3.TotalSold
должны быть float
или double
. Если они int
, то он выходит на 0
.
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.
Попробуйте следующее:
@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>
}
Я думал, что поделюсь тем, что сработало для меня,
У меня была эта же проблема: System.Web.HttpCompileException(0x80004005)
ниже исключения, которое я получаю: Имя "Url" не существует
Когда я посмотрел на представление, я заметил, что единственным местом, использующим Url, был код бритвы @Url.
В этом сообщении говорилось о ссылках на бритву и MVC.
Когда я смотрел в папке Views в решении, был файл web.config, содержащий все ссылки, однако он был переименован в web.src.config. Как только я изменил его на web.config, я снова и снова работал.