2011-07-21 32 views
5

¿Puede alguien explicar cómo se logra lo siguiente? El componente Telerik cuadrícula generará HTML no codificados por el código siguiente:Razor - Render sin Render() y sin Codificación

@(Html.Telerik().Grid(Model) 
     .Name("Grid") 
     .DataKeys(keys => keys.Add(c => c.ProductID)) 
     .DataBinding(dataBinding => dataBinding.Server() 
      .Select("ColumnSettings", "Grid") 
      .Update("ColumnSettings_Save", "Grid") 
      .Delete("ColumnSettings_Delete", "Grid")) 
     .Columns(columns =>columns.LoadSettings((IEnumerable<GridColumnSettings>)ViewData["Columns"])) 
     .Sortable() 
) 

Presumiblemente, esto ocurre porque la llamada al método se envuelve en "@ (....)". Cada vez que pruebo esto con mis propios componentes, el resultado es Html codificado. Sé que puedo usar Render() para generar un MvcHtmlString y luego mi Html no está codificado, pero la grilla de Telerik parece lograrlo sin .Render().

¿Alguien puede explicarme el secreto?

+1

Están devolviendo un 'IHtmlString' en lugar de una' cadena' estándar que MVC no codifica. http://geekswithblogs.net/shaunxu/archive/2010/04/10/lt-gt-htmlencode-ihtmlstring-and-mvchtmlstring.aspx – Buildstarted

Respuesta

3

La sintaxis @() permite que este comando abarque varias líneas (de lo contrario, un salto de línea se interpretaría incorrectamente como el final de la instrucción) y no afectará a la codificación.

Tiene razón: están generando un MvcHtmlString que evita la codificación automática de Razor.

Más específicamente, todos esos métodos son parte de un objeto Builder, una interfaz fluida que se devuelve desde cada llamada. El propio constructor implementa IHtmlString, por eso la llamada .Sortable() o cualquier otra llamada en esta cadena hará que el HTML no esté codificado.