Условная компиляция отключена в Razor? - PullRequest
12 голосов
/ 11 июля 2011

У меня есть цикл Cachach foreach, который выводит некоторый JavaScript, чтобы инициализировать некоторые индикаторы выполнения в моем представлении бритвы.

@foreach (var item3 in Model)
{
    @:$("#campaignMeter-@item3.ID").wijprogressbar({ value: @((item3.TotalRedeemed / item3.TotalSold) * 100), fillDirection: "east" });

}

Проблема, с которой я столкнулся, заключается в том, что visual studio сообщает о том, что «условная компиляция выключена» в цикле foreach, и небольшое вычисление значения всегда получается равным 0, несмотря на то, что TotalRedeemed и TotalSold имеют значения. Правильно ли я использую оператор @:? Спасибо за вашу помощь.

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

 @foreach (var item3 in Model)
 {

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

     <text>$("#campaignMeter-@item3.ID").wijprogressbar({ value: @percentage, fillDirection: "east" });</text>

 }

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

Ответы [ 4 ]

31 голосов
/ 05 марта 2012

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.

6 голосов
/ 11 июля 2011

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

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

item3.TotalRedeemed и item3.TotalSold должны быть float или double. Если они int, то получается 0.

2 голосов
/ 11 июля 2011

Попробуйте:

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

}

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

@foreach (var item in Model)
{
    <text>$('#campaignMeter-@(item.ID)').wijprogressbar({ 
        value: @item.SoldPercentage, 
        fillDirection: "east" 
    });</text>
}
0 голосов
/ 08 октября 2014

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...