2011-05-23 122 views
16

我最近將項目從MVC 1升級到了MVC 3,現在我正在嘗試使用Razor。關於Razor中嵌套代碼塊聲明的問題

在一個視圖中,我有一個foreach代碼塊,但嵌套的if語句似乎並不希望@在它的前面。

我原來的代碼是:

@foreach(var r in Model.Results) 
{ 
    string css = r.Result.Count() > 0 ? "fail" : "pass"; 

    <p class="@css"><strong>@r.Description</strong></p> 

    @if(r.Result.Count() > 0) 
    { 
     <p>Count: @r.Result.Count()</p> 
     <table> 
      <thead> 
       <tr> 
        <th>ID</th><th>Title</th><th>Description</th> 
       </tr> 
      </thead> 
      <tbody> 
      @foreach(var e in r.Result) { 
       <tr><td>@e.Id</td><td>@e.Title</td><td>@e.Description</td></tr> 
      } 
      </tbody> 
     </table> 
    } 
} 

我會用@if一個運行時錯誤,上面寫着:意外的「如果」關鍵字後,「@」字符。一旦進入代碼,你不需要像「@」這樣的結構前綴「if」。

如果我刪除@代碼運行良好。由於之前的HTML,我預計需要@。更讓我困惑的是,在嵌套的foreach之前,我確實需要@。這裏的規則是什麼?

+0

這裏有一個類似的問題,但我仍然不清楚@if和@foreach之間的區別。 http://stackoverflow.com/questions/4946334/razor-unexpected-foreach-keyword-after-character – Mattio 2011-05-23 15:48:19

回答

4

嵌套的foreach位於HTML內部(恰好在其他代碼中)。

要從標記代碼,您需要一個@
只有當直接嵌套代碼塊時纔有必要。

+0

我認爲這是明確的和衰退的 – gstar 2015-08-13 18:56:16

34

在剃鬚刀的任何圓括號內,它都需要一個匹配的開始和結束標籤。這就是解析器的工作原理。

下面到目前爲止的例子是有效的:

@for (var i = 0; i < 10; i++) { 
<p> 
    @i.ToString() 
</p> 
} 

這是不是:

@for (var i = 0; i < 10; i++) { 
<text> 
<p> 
    @i.ToString() 
</p> 
@if (i == 2) { 
<p>2</p> 
} 
</text> 
} 

@for (var i = 0; i < 10; i++) { 
<p> 
    @i.ToString() 
</p> 
@if (i == 2) { 
<p>2</p> 
} 
} 

爲了解決這個問題,你可以在<text>塊內等放置

所以在你的情況下,它會變成:

@foreach(var r in Model.Results) 
{ 
    @string css = r.Result.Count() > 0 ? "fail" : "pass"; 
<text> 

    <p class="@css"><strong>@r.Description</strong></p> 

    @if(r.Result.Count() > 0) 
    { 
    <p>Count: @r.Result.Count()</p> 
    <table> 
     <thead> 
      <tr> 
       <th>ID</th><th>Title</th><th>Description</th> 
      </tr> 
     </thead> 
     <tbody> 
     @foreach(var e in r.Result) { 
      <tr><td>@e.Id</td><td>@e.Title</td><td>@e.Description</td></tr> 
     } 
     </tbody> 
    </table> 
    } 
</text> 
} 
+2

哇,這不直觀。有誰知道這是否是剃鬚刀中的錯誤? – 2015-05-04 06:19:23

+1

看看... https://weblogs.asp.net/scottgu/asp-net-mvc-3-razor-s-and-lt-text-gt-syntax – 2017-04-05 14:53:14