#DEBUG Операторы препроцессора на странице ASPX
Я пытаюсь использовать директиву препроцессора на странице ASPX, но страница не распознает ее. Это что-то, чего я не могу сделать?
Справочная информация. Я пытаюсь включить полную версию jQuery в режиме DEBUG (для, ну, отладка =)) и мини-версию для выпуска. Я пробовал это, но я не очень хорошо знаком с синтаксисом ASPX <%. Я просто принципиально не понимаю, что делает этот синтаксис?
<% #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 %>
Ответы
Ответ 1
Интересная разница здесь - используя #if DEBUG на странице aspx вытаскивает из тега в web.config, но когда вы используете его в коде, он вытаскивает DEBUG из константы из конфигурации сборки в файле проекта, Таким образом, они фактически получают доступ к двум различным настройкам.
Таким образом, насколько я могу судить, на самом деле это невозможно.
Ответ 2
Лучшим подходом может быть использование кода на стороне сервера для включения script.
Я бы использовал что-то вроде
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
}
Ответ 3
Для меня самым элегантным решением было бы просто определить поле в коде с директивами препроцессора, а затем проверить его значение на странице 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" />
<%}%>
Ответ 4
Я пробовал ваш код, и он отлично работал у меня. Я включил или отключил DEBUG из раздела system.web/компиляции в 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
Конечно, есть и другие (лучшие) способы сделать то, что вам нужно...
Ответ 5
Я старался добиться этого на протяжении многих лет без каких-либо успехов. После игры
с 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
Ответ 6
У меня была та же проблема, я попытался решить ее как в приложении asp.mvc, так и в веб-приложении. Отладчик #if всегда возвращает true, он никогда не учитывает настройку компиляции web.config. Я решил это так же, как совет Syam, опубликованный в этом сообщении, но вместо статической функции я использую переменную astatcic, как описано здесь:
http://www.psworld.pl/Programming/DebugDirective
Ответ 7
Вот мое решение:
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");
}
}
Ответ 8
Я не думаю, что вы можете иметь препроцессорные директивы в aspx, к сожалению.
Простейший способ - просто иметь свойство в коде, которое находится в URL-адресе jQuery, тогда вы можете установить директивы препроцессора, чтобы объявить его. Или, если вы предпочтете сохранить URL-адрес в коде-infront, вы можете использовать элемент управления 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