В asp.Net при написании кода в теге control возникает ошибка компиляции - PullRequest
6 голосов
/ 22 марта 2012

Привет, это действительно странно !!

Но посмотрите на следующий код asp:

    <div runat="server" id="MainDiv">
      <%foreach (string str in new string[]{"First#", "Second#"})
          { %>
            <div id="<%=str.Replace("#","div") %>">
            </div>
        <%} %>
    </div>

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

Сообщение об ошибке компилятора: CS1518: ожидаемый класс, делегат, перечисление, интерфейс или структура

Конечно, ошибка не имеет ничего общего с реальной проблемой, я искал код, сгенерированный asp.net и выяснил следующее:

     private void @__RenderMainDiv(System.Web.UI.HtmlTextWriter @__w, System.Web.UI.Control parameterContainer)
    {
        @__w.Write("\r\n        ");

        #line 20 "blabla\blabla\Default.aspx"
        foreach (string str in new string[] { "First#", "Second#" })
        {

            #line default
            #line hidden
            @__w.Write("\r\n        <div id=\"");

            #line 22 "blabla\blabla\Default.aspx"
            @__w.Write(str.Replace("#", "div"));


            #line default
            #line hidden
            @__w.Write("\">\r\n        ");
     }

Это код, который был сгенерирован со страницы asp, и это метод, который предназначен для визуализации нашего div (MainDiv), я обнаружил, что отсутствует скобка "}", которая закрывает метод или (для петля). * * +1013

Теперь проблема состоит из трех частей:
1- сначала у вас должен быть серверный элемент управления (в нашем случае это MainDiv), и я не уверен, что это только тег div.
2- HTML-элемент управления внутри серверного элемента управления и код внутри него с использованием двойной кавычки (например, <div id="<%=str вместо <div id='<%=str.
3-Любое ключевое слово, которое имеет квадратные скобки, например:

теперь удаление любой детали решит проблему !!!

как это происходит ?? есть идеи?

Кстати: пожалуйста, помогите мне сделать вопрос более очевидным, потому что я не смог найти лучшие слова для описания проблемы.

Похоже, мой вопрос не ясен !! Мой вопрос: какие шаги выполняет asp.net для генерации такого неправильного кода ?? как это происходит !! Я не хочу решения для исключения, я уже решил его, используя одинарные кавычки.

Ответы [ 5 ]

6 голосов
/ 25 марта 2012

Вы не можете заключать двойные кавычки в двойные.

<div id="<%=str.Replace("#","div") %>">

Он не может сказать, когда нужно начинать или заканчивать, поэтому

<div id='<%=str.Replace("#","div") %>'>

будет работать.

В противном случае он думает, что код

 <div id="<%=str.Replace("
 ","
 div
 ") %>"
 )

что, конечно, не имеет смысла.

Обновление на основе моего комментария ниже

Добавление runat="server" вызывает анализ элемента управления ASP.NET, в противном случае он просто передается в виде html.

Если он анализируется ASP.NET, то все иначе. Если честно, я не уверен в точной внутренней работе здесь. Все, что я могу вам сказать, это то, что если установлен атрибут runat="server", то ASP.NET анализирует его и играет по другим правилам.

Он попытается разложить внутренний html, как я описал выше.

Если атрибут runat="server" удален, он передается в виде html, поэтому встроенный код обрабатывается, а затем просто выталкивается с окружающим html независимо от того, что это такое, например, двойные кавычки.

0 голосов
/ 01 апреля 2012

используйте одинарные кавычки вместо двойных

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

Это странно, и, вероятно, проблема заключается в использовании этого типа синтаксиса с веб-формами, но я смог получить этот код для компиляции и рендеринга div на страницу:

<div runat="server" id="MainDiv">
  <%foreach (string str in new string[] {"First#", "Second#"})
      {%>
        <div id='<%= string.Format("{0}", str.Replace("#","div")) %>'>
            Testing
        </div>
    <%}%>
</div> 
0 голосов
/ 30 марта 2012

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

@ __ w.Write ("\"> \ r \ n ");

Это выводит "> , а не просто > - это последний шеврон в этом утверждении

<div id="<%=str.Replace("#","div") %>">

Таким образом, на данный момент анализатор считает, что он находится в строке, но не находит терминатора, поэтому терпит неудачу - это означает, что последний

<%}%> никогда не анализируется - и ваша проблема возникает.

Я хотел бы предположить, что это происходит потому, что синтаксический анализатор работает линейно, и только когда пропавший терминатор строки «обнаружен», происходит сбой.

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

Это сработало для меня:

<div runat="server" id="MainDiv">
      <%foreach (string str in new string[]{"First#", "Second#"})%>
          <%{%>
          <% string str1 = str.Replace("#","div"); %>
           <div id='<%= str1%>'>123</div> 
           <%}%>
</div>
...