2011-04-07 12 views
5

El intento de hacer que un objeto de modelo en una estructura JSON a través de un parcial, como este:cómo escapar correctamente los frenos de la maquinilla de afeitar

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

El compilador de páginas se queja en la línea foreach, pensando en el símbolo @ es redundante. Al eliminarlo, se produce un error de compilación en la línea anterior. Si encierro las secciones completas de if/else en los bloques <text>, funciona.

Aparte de usar las secciones de texto explícito, hay una manera de dar a entender que el compilador o escapar de los frenos para evitar estos errores?

Respuesta

5

Dentro de un bloque de código, no puede usar los caracteres @ para crear más bloques de código.

cambiar el código para

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

Sin embargo, se debe utilizar un serializador JSON en su lugar.

+0

Perfecto, gracias –

3

Usando JavaScriptSerializer para convertir el objeto modelo en JSON es probablemente una mejor idea que este método.

En mi proyecto, he incluso hizo un HtmlHelper, así:

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

A continuación, podría utilizarlo en su vista, como:

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