KendoUI,您可以在 Template() 或 ClientTemplate() 中调用 C# 方法吗?

KendoUI, can you call C# methods within Template() or ClientTemplate()?

我需要生成一个 URL 以显示在我用 Kendo 网格创建的 table 中。问题是这个 URL 必须从模型 ID 生成。例如:

string aUrl = Url.GenerateUrl(person.Id);

然而,将它与 kendo 网格一起使用有点棘手:

...Kendo()
.Grid<Person>()
.Name("gridPeople")
.Columns(columns =>
{
   columns.Bound(p => p.Name);
   columns.Bound(p => Url.GenerateUrl(p.Id));
})
.DataSource(dataSource => dataSource
.Ajax()
.Read(read => read.Action("ReadPeople", "Person"))
)

会导致错误:

bound columns require a field or property access expression

我不确定如何实现它。我试过:

columns.Bound(p => p.Id).ClientTemplate(@Url.GenerateUrl("#: Id #"))

columns.Bound(p => p.Id).ClientTemplate("@Url.GenerateUrl(#: Id #)")

但都不起作用。第二个接近,但打印文本“@Url.Generate(XXXX-SOME-IDNO)”,其中 ID 已从模型中正确填充。但我希望它打印出该函数的结果,而不是打印出实际的编程语句:(

检查第一种方法是否存在语法错误,因为 " 放置错误。

columns.Bound(p => p.Id).ClientTemplate(@Url.GenerateUrl("#: Id #"))

其次,您可以尝试调用一个 jquery 函数,在其中传递 Id 和函数 returns 生成的 URL.

我相信 Url.GeneralUrl 只在页面呈现时计算一次,因为您使用 AJAX 作为数据源。所以你的客户端模板是调用 Url.GenerateUrl("#: Id #") 的结果,我不知道那个客户端模板是什么,但听起来它不适合你。

相反,尝试将 URL 添加到您的网格模型并在服务器端填充它(您的控制器可以创建一个 UrlHelper,如果您不知道如何操作,请进行互联网搜索)。

顺便说一句,当您已经在 C# 上下文中时,您不需要“@”符号来写出 C# 代码。所以会是

columns.Bound(p => p.Id).ClientTemplate(Url.GenerateUrl("#: Id #"))

而不是

columns.Bound(p => p.Id).ClientTemplate(@Url.GenerateUrl("#: Id #"))