2013-09-05 17 views
5

私は次のコードを使用してテーブルにデータを設定しています。 ifステートメントが期待通りに機能しません。条件ブロック内の両方のステートメントが実行されます。C#コードのHTMLページで条件が機能しない場合

  @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> 
} 

ここでは何が欠けていますか? このような使用は不可能ですか?

EDIT (答えを見た後)

私は思った -

は一度コードの中には、 "@" と

の "if" のように構築する接頭辞にする必要はありません

答えて

11

@から始める必要があります。

@foreach (Message userMessage in UserMessages) 
{ 

と...

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

それがなければ開始時に、if(はまだHTMLとして扱われます。


@シンボルは、あなたのカミソリ構文(すなわちC#コード)の開始を識別し、適切なターミネーターに達するまでカミソリコードブロックであり続けるだろう。 HTMLに戻すにはいくつかの方法がありますが、あなたの例で最もよく見られるのは、<td>などのhtmlタグを含めることです。ここで

がうまくいけば、それはあなたがそれがどのように動作するかを理解するのに役立ちます、あなたのコードの完全なバージョンです:

<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> 

(私はカミソリでこれらのコメント文句を言わない仕事を知っているので、それらを追加しないでください)


あなたが最初に考えたことをクリアしてください。あなたが最初<tr>のタグを持っていなかった場合は、以下では、我々は戻ってHTMLモードに移動することがないため、ステートメント行が、@記号を必要としない場合、どのように全体...

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

お知らせを働くだろう。

+0

私はすでにあれば、外側の文を持っています。それで内側のものは必要ですか? –

+2

@Rohit:はい、HTMLタグはHTMLに戻ってしまうためです。より良い説明のために私の編集を参照してください – musefan

1

コードの問題は、HTMLとRazorが混在していることです。 @記号は、あなたのRazorコードが始まる場所であると想定されているため、Razorコード内で使用する必要はありません。

if(@userMessage.Message.MessageText.Length <= 10)と書くとifはRazorコードではなくHTMLの一部です。したがって、HTMLを残して剃刀モードに入るたびに、@というマークを付ける必要があります。 ifステートメントは、代わりに@if(userMessage.Message.MessageText.Length <= 10)のように表示する必要があります。

あなたのコードの完全な例は次のようになります。

<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> 
関連する問題