2013-09-05 9 views
5

Używam następującego kodu do wypełnienia tabeli danymi. Instrukcja if nie działa zgodnie z oczekiwaniami. Zarówno instrukcje w blokach warunkowych są wykonywane.Jeśli warunek nie działa na stronie HTML z kodem C#

  @if (--somecondition--) 
  { 
     <table> 
     foreach (Message userMessage in UserMessages) 
     {        
       <tr> 
        if(@userMessage.Message.MessageText.Length <= 10) 
        { 
         <td> 
          @userMessage.Message.MessageText 
         </td> 
        } 
        if(@userMessage.Message.MessageText.Length > 10) 
        { 
         <td> 
          @userMessage.Message.MessageText.Substring(0, 10) 
         </td> 
        }  
       </tr>   
     } 
    </table> 
} 

Czego tu mi brakuje? Czy takie użycie nie jest możliwe?

EDIT (po obejrzeniu odpowiedź):

myślałem -

Raz wewnątrz kodu, nie trzeba poprzedzić konstrukcje jak "czy" na "@"

Odpowiedz

11

Musisz zacząć od @ ...

@foreach (Message userMessage in UserMessages) 
{ 

i ...

@if(userMessage.Message.MessageText.Length <= 10) 
{ 

Bez niego na początku, if( jest nadal traktowany jako HTML.


@ symbol identyfikujący rozpoczęcia swojej składni Razor (czyli kodu C#) i nadal będzie blok kodu brzytwa, aż zostanie osiągnięta odpowiednia terminator. Istnieje kilka sposobów przeniesienia go z powrotem do formatu HTML. Najczęściej spotykany w tym przykładzie jest tag HTML, na przykład <td>.

Oto pełna wersja kodu, mam nadzieję, że to pomoże Ci zrozumieć, jak to powinno działać:

<table> 
//due to the table tag, we are current inside HTML 
//so we need to use the @ symbol to move back to razor syntax 
@foreach (Message userMessage in UserMessages) 
{        
    <tr> 
    //using this tag again changes us back to HTML mode 
    //so again we must use the at symbol 
    @if(userMessage.Message.MessageText.Length <= 10) 
    { 
     //still Razor 
     <td> 
     //back in HTML mode 
      @userMessage.Message.MessageText 
     </td> 
    } 
    @if(userMessage.Message.MessageText.Length > 10) 
    { 
     <td> 
      @userMessage.Message.MessageText.Substring(0, 10) 
     </td> 
    }  
    </tr>   
} 
</table> 

(wiem, że te komentarze przyzwyczajenie praca w Razor więc nie dodać je)


I wyjaśnić to, co początkowo sądziłeś. Jeśli nie masz pierwszego <tr> znacznik, a następnie dodaje będzie działać ...

@foreach (Message userMessage in UserMessages) 
{ 
    if(userMessage.Message.MessageText.Length <= 10) 
    { 

Wskazówki jak cała linia jeśli oświadczenie nie wymagał @ symbol, ponieważ nigdy nie przeniósł się z powrotem do trybu HTML.

+0

mam już zewnętrzną if. Czy potrzebne są te wewnętrzne? –

+2

@Rohit: Tak, ponieważ znaczniki html zmienią go z powrotem na HTML. Zobacz moją edycję dla lepszego wyjaśnienia – musefan

1

Problem z kodem polega na tym, że miksujesz zawartość HTML i brzytwę. Znak @ powinien być tam, gdzie zaczyna się Twój kod Razor, a następnie nie musisz go używać wewnątrz kodu Razor.

Podczas pisania if(@userMessage.Message.MessageText.Length <= 10), if nie jest postrzegany jako kod brzytwy, ale część kodu HTML. Za każdym razem, gdy opuszczasz HTML i przechodzisz do trybu Razor, musisz mieć znak @. Instrukcja if powinna wyglądać jak @if(userMessage.Message.MessageText.Length <= 10).

Kompletny przykład kodu wyglądałby następująco:

<table> 
@foreach (Message userMessage in UserMessages) 
{        
    <tr> 
    @if(userMessage.Message.MessageText.Length <= 10) 
    { 
     <td> 
     @userMessage.Message.MessageText 
     </td> 
    } 

    @if(userMessage.Message.MessageText.Length > 10) 
    { 
     <td> 
     @userMessage.Message.MessageText.Substring(0, 10) 
     </td> 
    }  
    </tr>   
</table> 
Powiązane problemy