2012-03-22 6 views
6

Cześć, to naprawdę dziwne !!W asp.Net, pisanie kodu w tagu kontrolnym generuje błąd kompilacji

Ale spójrz na poniższym kodzie asp:

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

teraz jeśli umieścić ten kod wewnątrz dowolnej stronie internetowej (i nie martwić się o morał tego kodu, zrobiłem to, żeby pokazać pomysł) dostaniesz ten błąd:

Compiler error Message: CS1518: Oczekiwany klasa, delegat, enum, interfejs, lub struktura

oczywiście błąd nie ma nic wspólnego z prawdziwym problemem, szukałem kod wygenerowany przez asp.net i zorientowali się, co następuje:

 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  "); 
    } 

Jest to kod, który został wygenerowany ze strony asp i jest to metoda, która ma na celu uczynić nasz div (MainDiv), okazało się, że jest tam brakuje nawias „} "to zamyka metodę lub (dla pętli).

teraz problem składa się z trzech części:
1- najpierw powinieneś mieć kontrolę serwera (w naszej sytuacji jest MainDiv) i nie jestem pewien, czy jest to tylko znacznik div.
2- sterowania HTML wewnątrz serwera i kontroli kodu w środku za pomocą podwójnego znaku zapytania (na przykład <div id="<%=str zamiast <div id='<%=str
3-Każdy klucz który ma przymocowane bloku np. Na {}, a {} stosując { .} ... itp

teraz usunięcie jakiejkolwiek części, rozwiąże problem !!!

jak to się dzieje ?? jakieś pomysły

BTW: proszę mi pomóc w podjęciu pytanie więcej oczywiste, ponieważ nie mogłem znaleźć najlepszych słów, aby opisać problem.

Wygląda na to, że moje pytanie nie jest jasne !! Moje pytanie brzmi: jakie kroki wykonuje asp.net w celu wygenerowania takiego błędnego kodu? jak to się dzieje! Nie chcę rozwiązania dla wyjątku, już rozwiązałem go za pomocą pojedynczego cudzysłowu.

Odpowiedz

0

Ten pracował dla mnie:

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

Ok, wiem, jak rozwiązać problem, i już go rozwiązałem, ale jestem po prostu ciekawy, w jaki sposób ten błąd się wydarzył? –

6

nie można ująć w cudzysłów cudzysłów.

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

Nie można powiedzieć, kiedy jeden ma początek lub koniec, dlatego

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

będzie działać.

przeciwnym razie uważa, że ​​kod jest

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

co oczywiście nie ma sensu.

Aktualizacja oparta na moim komentarzu poniżej

dodanie runat="server" powoduje kontrolę zostać przeanalizowany przez ASP.NET, inaczej to jest właśnie przeszedł prosto jako html.

Jeśli zostanie przeanalizowany przez ASP.NET, rzeczy są różne. Szczerze mówiąc nie jestem pewien dokładnego działania wewnętrznego tutaj. Wszystko, co mogę powiedzieć, to to, że jeśli atrybut runat="server" jest ustawiony, to ASP.NET analizuje go i odtwarza według różnych reguł.

Spróbuje rozłożyć wewnętrzny html, jak opisano powyżej.

Jeśli atrybut runat="server" zostanie usunięty, zostanie przekazany jako html, dlatego przetwarzany jest kod śródliniowy, a następnie wypychany z otaczającym go html, niezależnie od tego, jaki jest, np. podwójne cytaty.

+0

ale jeśli nadal używasz podwójnych cudzysłowów i na przykład usuniesz runat = "server" z głównego div, problem zostanie rozwiązany ??? więc problemu nie ma w podwójnych cytatach !!! –

+2

Cóż, niezupełnie. Dodanie runat = "server" powoduje, że kontrolka jest analizowana przez ASP.NET, w przeciwnym razie jest po prostu przekazywana prosto jako html. Jeśli zostanie przeanalizowany przez ASP.NET, rzeczy są inne. Szczerze mówiąc nie jestem pewien dokładnego działania wewnętrznego tutaj. Wszystko, co mogę powiedzieć, to to, że jeśli atrybut runat = "server" jest ustawiony, to ASP.NET analizuje go i odtwarza według różnych reguł. Najprawdopodobniej spróbuje rozłożyć wewnętrzny HTML, jak opisano powyżej w mojej odpowiedzi. –

+1

@Dvowaner - zwykle uprzejmie wypowiada się, dlaczego została odrzucona, więc mamy okazję ulepszyć odpowiedź. –

0

Nie jestem pewien, czy będziesz w stanie całkowicie zrozumieć, dlaczego parser robi to, co jest, ale jest oczywiste z ostatniej prawdziwej linii kodu, że ma knickers w skręcie.

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

ten wprowadza się "> a nie tylko > - to jest w tym ostatnim Chevron oświadczenie

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

tak, w tym momencie parser uważa, że ​​w ciągu, ale nie stwierdza terminator, więc nie powiedzie się - oznacza ostatni

to

%}%> nigdy nie jest analizowany - i pojawia się problem.

Sugerowałbym, że to dlatego, że parser działa w sposób liniowy i nie jest aż brakujący ciąg terminatora „odkrył”, że fail dzieje.

0

To jest dziwne i to prawdopodobnie problem z używaniem tego typu składni z webforms, ale udało mi się uzyskać ten kod do kompilacji i tynku DIV na stronie:

<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

@NourSabouny: problemem są podwójne cytaty. Powyższy kod kompiluje i renderuje dane wyjściowe zgodnie z oczekiwaniami. –

0

apostrofów zamiast podwójnego

+0

Mój przyjacielu, już wspomniałem rozwiązanie w moim pytaniu, a ty nie odpowiadasz na moje pytanie !!! –