2016-11-16 64 views
1

我在cshtml Razor視圖中遇到了VS2015中的一個奇怪問題。我認爲它一定是Razor的一個bug,但是如果是poss,會感謝一個理智的檢查和一個解決方法的建議。在VS2015中使用ASP.NET MVC Razor時無法識別大括號

此問題是@{}代碼塊中的花括號不能正確解析。我在foreach循環中有一個if語句,如果我使用大括號來包圍if操作,則會出現編譯錯誤。有趣的是,在else聲明之後的花括號看起來很好。

這將更容易與VS顏色編碼演示,但在這裏。

這工作:

@{ 
    var nestLevel = 0; 
    foreach (var t in xmlHelper.GetProperties(asm, ViewBag.xmlType, "root")) 
    { 
     var type = @t.Item3.PropertyType; 
     if (xmlHelper.builtInTypes.Contains(type.ToString())) 

      <p>@t.Item1 @t.Item2 @t.Item3.PropertyType</p> 

     else 
     { 
      nestLevel++; 
     } 
    } 
} //VS shows the @{} code block ending here as expected 

但是,如果現在我周圍添加if動作大括號,它不會編譯:

@{ 
    var nestLevel = 0; 
    foreach (var t in xmlHelper.GetProperties(asm, ViewBag.xmlType, "root")) 
    { 
     var type = @t.Item3.PropertyType; 
     if (xmlHelper.builtInTypes.Contains(type.ToString())) 
     { 
      <p>@t.Item1 @t.Item2 @t.Item3.PropertyType</p> 
     } 
     else 
     { 
      nestLevel++; 
     } 
    } //VS now incorrectly shows the @{} code block ending here 
} 

任何想法/建議?

回答

3

從該行中刪除@:

var type = @t.Item3.PropertyType; 

你已經在C#代碼區,所以你不需要@引用變量你,如果你是在一個HTML區域。

可以在下面的行上做到這一點,因爲當你使用已識別的HTML開始一行時,它會假定切換回HTML,並跳出C#。所以你有效地在HTML部分。

<p>@t.Item1 @t.Item2 @t.Item3.PropertyType</p> 

正如順便說一句,我經常使用這個快捷方式,當我想迫使HTML模式,這樣我可以輸出變量的值,結束我們。

@if (t.isExample) 
{ 
    @: @t.OutputThis 
} 
+0

真棒 - 是的,它修復了它。小學生錯誤!謝謝 – ShhTot

0
當您使用@在剃刀意見令牌

,你告訴引擎停止解析HTML,並試圖解釋C#語言,剃鬚刀是足夠聰明,知道什麼時候,因爲令牌你停止解析試圖編寫是html語言的一部分,所以你需要指定在哪一點剃鬚刀應該讀取你的C#代碼,這就是爲什麼你的if語句你需要再次用@標記打開識別。如果您想要轉義@標記,因爲您正在嘗試將@寫爲html,請使用@@。希望這可以幫助

相關問題