2011-04-07 4 views
5

如何正確逃生括號試圖通過局部渲染模型對象爲JSON結構,像這樣:在剃刀

@if(Model.IsEmpty) { 
    @(Model.UseNull ? "null" : "") 
} else { 
    @{ int i = 0; } 
    @foreach(var program in Model.Programs) { 
    <text>  
    @(++i > 1 ? "," : "") 
    { 
     "Id": "@program.ProgramId", 
     "Title": "@Html.Js(program.Title)", 
     "Url": "@Html.Js(program.Url)", 
    } 
    </text> 
    } 
} 

頁面編譯器抱怨上的foreach線,想着@符號是多餘的。刪除它會導致之前的行上出現編譯錯誤。如果我在<text>塊中包含if/else的整個部分,它就會起作用。

除了使用明確的文本部分,有沒有辦法提示編譯器或逃避大括號,以避免這些錯誤?

回答

5

裏面一個代碼塊,您不能使用@字符來創建更多的代碼塊。

更改您的代碼

@if(Model.IsEmpty) { 
    if (Model.UseNull) { 
     @:null 
    } 
} else { 
    int i = 0; 
    foreach(var program in Model.Programs) { 
     if (++i > 1) { 
      @:, 
     } 
     <text>  
      { 
       "Id": "@program.ProgramId", 
       "Title": "@Html.Js(program.Title)", 
       "Url": "@Html.Js(program.Url)", 
      } 
     </text> 
    } 
} 

但是,你應該使用JSON序列代替。

+0

完美,謝謝 – 2011-04-08 01:36:36

3

使用JavaScriptSerializer將模型對象轉換爲JSON可能比此方法更好。

在我的項目,我已經連上了一個的HtmlHelper,就像這樣:

private static readonly JavaScriptSerializer JsonSerializer = new JavaScriptSerializer(); 
public static HtmlString ToJson<T> (this HtmlHelper htmlHelper, T obj) 
{ 
    return new HtmlString(JsonSerializer.Serialize(obj)); 
} 

然後,您可以在您的視圖中使用它,比如:

<script type="text/javascript"> 
    var model = @Html.ToJson(Model); 
</script>