#DEBUG Операторы препроцессора на странице ASPX - PullRequest
24 голосов
/ 26 ноября 2009

Я пытаюсь использовать директиву препроцессора на странице ASPX, но страница не распознает ее. Это то, что я не могу сделать?

Справочная информация: я пытаюсь включить полную версию jQuery в режиме отладки (для отладки =), а также минимизированную версию для выпуска. Я пробовал это, но я не очень знаком с синтаксисом ASPX <%. Я просто принципиально не понимаю, что делает этот синтаксис? </p>

<% #if DEBUG %>
<script type="text/javascript" src="resources/jquery-1.3.2.js" />
<% #else %>
<script type="text/javascript" src="resources/jquery-1.3.2.min.js" />
<% #endif %>

Ответы [ 8 ]

16 голосов
/ 27 января 2010

Интересная разница здесь - использование #if DEBUG на странице aspx извлекает из тега в web.config, но когда вы используете его в коде, он извлекает DEBUG из константы из конфигурации сборки в файле проекта , Таким образом, они фактически получают доступ к двум различным настройкам.

Таким образом, насколько я могу судить, это на самом деле невозможно.

6 голосов
/ 26 ноября 2009

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

protected void Page_Load(object sender, EventArgs e)
{
#if DEBUG    
    ScriptManager.RegisterClientScriptInclude(this, this.GetType(), "JQueryScript", "resources/jquery-1.3.2.js");
    #else
    ScriptManager.RegisterClientScriptInclude(this, this.GetType(), "JQueryScript", "resources/jquery-1.3.2.min.js");
    #endif
}
4 голосов
/ 09 сентября 2013

Для меня самым элегантным решением было бы просто определить поле в выделенном коде с помощью директив препроцессора, а затем проверить его значение на странице aspx.

В коде позади:

public partial class WebClient : System.Web.UI.Page
{        
#if DEBUG 
    public bool DebugMode = true;
#else
    public bool DebugMode = false;
#endif
}

Страница Aspx:

<%if(this.DebugMode){%>
    <script type="text/javascript" src="resources/jquery-1.3.2.js" />
<%}%>
<%else{%>
    <script type="text/javascript" src="resources/jquery-1.3.2.min.js" />
<%}%>
1 голос
/ 26 ноября 2009

Я попробовал твой код, и он работал нормально для меня. Я включил или отключил DEBUG из раздела system.web / compilation в web.config, работающего как веб-сайт (не тестировался как веб-приложение; может отличаться ...).

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

Подсказка: директивы препроцессора вставляются в вывод .

Line 218:     #if DEBUG 
Line 219:              
Line 220:              #line default
Line 221:              #line hidden
Line 222:              @__w.Write("\r\n<script type=\"text/javascript\" src=\"resources/jquery-1.3.2.js\" />\r\n");
Line 223:              
Line 224:              #line 14 "F:\Test\test.aspx"
Line 225:     #else 
Line 226:              
Line 227:              #line default
Line 228:              #line hidden
Line 229:              @__w.Write("\r\n<script type=\"text/javascript\" src=\"resources/jquery-1.3.2.min.js\" />\r\n");
Line 230:              
Line 231:              #line 16 "F:\Test\test.aspx"
Line 232:     #endif

Конечно, есть и другие (лучшие) способы сделать то, что вы ищете ...

0 голосов
/ 18 марта 2012

У меня была та же проблема, я пытался решить ее как в приложении asp.mvc, так и в приложении webform. Отладка #if всегда возвращает true, она никогда не учитывает настройки компиляции web.config. Я решил это аналогично совету Syam, опубликованному в этом посте, но вместо статической функции я использую астатическую переменную, как описано здесь: http://www.psworld.pl/Programming/DebugDirective

0 голосов
/ 02 апреля 2011

В течение многих лет я пытался достичь этого многими способами, но безуспешно. После игры с asp.net mvc недавно у меня появилась эта идея. Есть еще одна возможность сохранить все это в Страница ASPX с использованием недопустимых типов MIME. В asp.net MVC шаблоны загружаются с неверным MIME типы, так что браузер не будет их анализировать. Я следовал той же схеме здесь; Вола! Успех ... Вам нужна одна статическая функция, которая дает вам легкий доступ к ограничению отладки.

<script src='<%= Page.ResolveUrl("~/Scripts/jquery-1.5.2.min.js") %>' 
    **type='<%=if(Ops.IsRelease(),"text/javascript","HideMin")%>'**></script> 

Ops.IsRelease () - публичная статическая функция, которая возвращает отладочную информацию

    Public Shared Function IsRelease() As Boolean
        Dim [release] = False
#If Not debug Then
        [release]=True
#End If
        Return [release]
    End Function
0 голосов
/ 15 марта 2011

Вот мое решение:

protected void Page_Load(object sender, EventArgs e)
{
    if (System.Diagnostics.Debugger.IsAttached)
    {
        ScriptManager.RegisterClientScriptInclude(this, this.GetType(), "JQueryScript", "resources/jquery-1.3.2.js");
    }
    else
    {
        ScriptManager.RegisterClientScriptInclude(this, this.GetType(), "JQueryScript", "resources/jquery-1.3.2.min.js");
    }
}
0 голосов
/ 26 ноября 2009

К сожалению, вы не можете иметь директивы препроцессора в aspx.

Более простой способ состоит в том, чтобы просто иметь в своем коде свойство, передающее URL-адрес jQuery, затем вы можете установить директивы препроцессора для его объявления. Или, если вы предпочитаете сохранить URL-адрес в коде, вы можете использовать элемент управления Literal и переключать их видимость в коде на основе директив процессора.

Например:

код-Infront:

<asp:literal id="litJQuery" EnableViewState="false" runat="Server">
<script type="text/javascript" src="resources/jquery-1.3.2.js" />
</asp:literal>
<asp:literal id="litJQueryDebug" EnableViewState="false" Visible="false" runat="Server">
<script type="text/javascript" src="resources/jquery-1.3.2.min.js" />
</asp:literal>

code-behind, в методе Page_Load:

#if DEBUG
litJQueryDebug.Visible=true;
litJQuery.Visible=false;
#endif
...