2011-04-07 134 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>