2011-07-21 154 views
5

有人可以解釋如何實現以下內容。所述Telerik的網格部件將產生非編碼HTML用下面的代碼:剃刀 - 渲染無渲染()和無編碼

@(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() 
) 

據推測,這是因爲該方法調用被包裹在「@(....)」。每當我用我自己的組件嘗試這個結果時,編碼Html。我知道我可以使用Render()來輸出一個MvcHtmlString,然後我的Html不被編碼,但Telerik網格似乎無需使用.Render()。

任何人都可以解釋我的祕密嗎?

+1

他們正在返回一個'IHtmlString'而不是一個MVC不編碼的標準'string'。 http://geekswithblogs.net/shaunxu/archive/2010/04/10/lt-gt-htmlencode-ihtmlstring-and-mvchtmlstring.aspx – Buildstarted

回答

3

@()語法只允許此命令跨越多行(否則換行符會被解釋 - 不正確 - 作爲語句的結尾)並且不會影響編碼。

你是對的 - 他們正在輸出一個避免自動Razor編碼的MvcHtmlString。

更具體地說,所有這些方法都是Builder對象的一部分,它是一個流暢的接口,它從每次調用都返回自己。 Builder本身實現了IHtmlString,所以這就是爲什麼.Sortable()調用或此鏈中的任何其他調用都會使HTML未編碼。