我在为Kendo网格中的列定义ASP.NET MVC ClientTemplate时遇到问题,因为“+”符号被剥离,导致客户端生成的模板由于语法错误而失败。 / p>
我的ClientTemplate是:
c.Template(@<text></text>).ClientTemplate("#='Hello' + Name#")
然而,在客户端,这会减少为:
template: "#='Hello' Name#"
即。加号已被渲染为空格(类似于我猜的URL编码)。如果我直接使用JS,模板的效果非常好(请参阅此JSBin)。
有没有人知道如何逃避+符号以便我可以在ClientTemplate中使用它?
我尝试使用“\\+
”进行转义(呈现为“\
”),“\+
”(无效的C#),+
(与{{相同) 1}},尽管+
之类的其他工作正常。)
有什么想法吗?感谢。
作为参考,我正在使用Razor标记和2012年第2季的Kendo版本(当我们从Telerik升级时,不能使用Q3但受限于jQuery版本)
注意:在有人问我为什么要这样做之前,我的ClientTemplate实际上更复杂,但这是一个简化的例子来说明问题: - )
答案 0 :(得分:10)
我检查了源代码 1 ,MVC包装器在将它们呈现给JS之前在所有模板上调用HttpUtility.UrlDecode
。因此,要转义+号(或任何其他保留的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行。我怀疑这是一个错误,他们打算致电{ {1}}。
答案 1 :(得分:6)
找到解决方案(可能更多的解决方法)。我没有编写内联JavaScript,而是将代码移到一个单独的JS函数中,并从模板代码中调用它,例如:
#=myFunctionToDoComplicatedStuff(Name)#
说实话,出于可测试性,重用和一般良好实践的原因,这可能是应该采取的方法。虽然这对于一些微不足道的东西来说有点烦人!
答案 2 :(得分:1)
如果您只是需要一个简单的解决方案来在ClientTemplate中进行连接以避免加号的编码问题,您可以使用这样的javascript concat函数:
c.Template(@<text></text>).ClientTemplate("#='Hello'.concat(Name)#")
答案 3 :(得分:0)
您是否尝试过算术并将其置于引号之外,如下所示:
c.Template(@<text></text>).ClientTemplate("#='Hello'" + "Name#")
答案 4 :(得分:0)
对于它的价值,我只是遇到了这个并通过减去负值来解决它。如:
kendo.parseFloat(Amount) - -kendo.parseFloat(Tip)
答案 5 :(得分:0)
我使用alternative plus sign找到了解决方案。
c.Template(@<text></text>).ClientTemplate("#='Hello' (<span style=\\'font-size: 0.6em\\'>➕</span>{ Name#")
这将导致......
template: "#='Hello + Name#"