5

我正在使用以下代码用数据填充表。该if声明没有按我的预期工作。条件块中的两个语句都被执行。

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

我在这里想念什么?这样的使用是不可能的吗?

编辑(看到答案后)

我想 -

进入代码后,您无需在“if”之类的结构前面加上“@”

4

2 回答 2

11

你需要从@...开始

@foreach (Message userMessage in UserMessages)
{

和...

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

一开始没有它,if(仍然被视为 HTML。


@符号标识 Razor 语法(即 C# 代码)的开始,并将继续作为 Razor 代码块,直到到达适当的终止符。有多种方法可以将其移回 HTML,在您的示例中最常见的一种方法是包含一个 html 标记,例如<td>.

这是您的代码的完整版本,希望它能帮助您了解它应该如何工作:

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

(我知道这些评论在 Razor 中不起作用,所以不要添加它们)


并澄清你最初的想法。如果您没有第一个<tr>标签,那么以下将起作用......

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

注意整个 if 语句行不需要@符号,因为我们从未回到 HTML 模式。

于 2013-09-05T09:34:00.913 回答
1

您的代码的问题在于您混淆了 HTML 和 Razor。该@标志应该是你的 Razor 代码开始的地方,然后你不需要在 Razor 代码中使用它。

当您编写if(@userMessage.Message.MessageText.Length <= 10)then时if,它不会被视为 Razor 代码,而是 HTML 的一部分。因此,每次您离开 HTML 并进入 Razor 模式时,您都需要有一个@标记。该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>
于 2013-09-05T09:48:56.473 回答