有人可以解释如何实现以下目标。 Telerik Grid组件将使用以下代码生成非编码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()。
有人可以向我解释这个秘密吗?
答案 0 :(得分:3)
@()语法只允许此命令跨越多行(否则会断言换行符 - 错误地 - 作为语句的结尾)并且不会影响编码。
你是对的 - 他们正在输出一个MvcHtmlString,它避免了自动Razor编码。
更具体地说,所有这些方法都是Builder对象的一部分,一个流畅的接口,它从每次调用返回自己。 Builder本身实现IHtmlString,这就是为什么.Sortable()调用或此链中的任何其他调用将使HTML未编码。