8

我在为 Kendo 网格中的列定义 ASP.NET MVC ClientTemplate 时遇到问题,因为“+”号已被删除,这会导致客户端生成的模板因语法错误而失败。

我的客户模板是:

c.Template(@<text></text>).ClientTemplate("#='Hello' + Name#")

但是,在客户端中,这会简化为:

template: "#='Hello'   Name#"

即加号已呈现为空格(我猜类似于 URL 编码)。如果我直接从 JS 使用,该模板可以完美运行(请参阅此JSBin)。

有谁知道我如何逃避 + 号以便在 ClientTemplate 中使用它?

我尝试使用 ' \\+' 转义(呈现为 ' \')、' \+'(无效的 C#)、&#43;(与 ' 相同+,尽管其他诸如&#44;' 工作正常)。

有任何想法吗?谢谢。

作为参考,我正在使用 Razor 标记和 Q2 2012 Kendo 版本(不能使用 Q3,因为我们从 Telerik 升级时受 jQuery 版本的限制)

注意:在有人问我为什么要这样做之前,我的 ClientTemplate 实际上更复杂,但这是一个说明问题的简化示例 :-)

4

6 回答 6

11

我检查了源代码1HttpUtility.UrlDecode ,MVC 包装器在将它们呈现给 JS 之前调用所有模板。因此,要转义您的 + 号(或任何其他保留的 URL 字符),请使用percent encoding。在这种情况下%2B

c.Template(@<text></text>).ClientTemplate("#='Hello' %2B Name#")

1 v2013.3,src\Kendo.Mvc\Kendo.Mvc\UI\Grid\Columns\GridColumnBase.cs,第 135 行。我怀疑这是一个错误,他们打算调用HttpUtility.UrlEncode.

于 2014-06-23T16:36:09.310 回答
7

找到了一个解决方案(可能更多的解决方法)。我没有编写内联 JavaScript,而是将我的代码移动到一个单独的 JS 函数并从模板代码中调用它,例如:

#=myFunctionToDoComplicatedStuff(Name)#

老实说,出于可测试性、重用和一般良好实践的原因,这可能是无论如何都应该采用的方法。不过对于一些琐碎的事情来说有点烦人!

于 2013-01-22T09:36:12.160 回答
1

如果您只需要一个简单的解决方案来在您的 ClientTemplate 中进行连接以避免加号的编码问题,您可以使用 javascript concat 函数,如下所示:

c.Template(@<text></text>).ClientTemplate("#='Hello'.concat(Name)#")
于 2013-07-19T17:12:40.200 回答
0

您是否尝试过将算术运算并将其放在引号之外,如下所示:

c.Template(@<text></text>).ClientTemplate("#='Hello'" + "Name#")

于 2013-01-17T17:03:43.107 回答
0

对于它的价值,我只是遇到了这个问题并通过减去一个负值来解决它。如:

kendo.parseFloat(Amount)  - -kendo.parseFloat(Tip)
于 2013-03-14T23:25:16.960 回答
0

我通过使用替代加号找到了解决方案。

c.Template(@<text></text>).ClientTemplate("#='Hello' (<span style=\\'font-size: 0.6em\\'>&#10133;</span>{ Name#")

这将导致...

template: "#='Hello + Name#"
于 2013-05-17T12:58:02.663 回答