2011-07-21 87 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未编码。