Umbraco Razor HTML转义问题

3

在Umbraco 4.11.10中遇到了一些问题,具体是使用剃刀宏(razor macro)的时候,让我陷入了困境。

问题:

在文本框多行字段中包含HTML元素,执行剃刀脚本时会“破坏”属性边界。

更多细节:

基本的宏有一个文本框多行字段,该字段作为参数传递到剃刀脚本中。

对于纯文本,这很有效,但最近的需求需要在此文本的各个位置添加标签。

我已经尝试过:

最初,我尝试对HTML进行转义,如下所示

>sup<1,2>/sup<

这很好用,直到我重新加载节点并重新发布时,查看数据库时发现,似乎第一次保存宏时,正确的转义HTML被包括在宏参数中:

description="(text here)>sup<1,2>/sup<(more text)" ...

当节点重新加载时,渲染的输出是实际的HTML字符(假设在显示在Umbraco后端之前进行了解码)。
<sup>1,2</sup>

当重新发布时,所传递的内容“原样”传递给 Razor 宏。

 description="SINGLE (n=833) <sup>1,2</sup>

这将从第一个HTML标记的结尾开始,一直输出到宏参数的结尾作为其输出结果:
<p> ***+ ***vs ***(Should Stop Here)" hideBorder="0" preview="0" /></p>

需要翻译的内容:

希望在使用Razor参数时能否将HTML元素添加到多个文本框中,或者当重新加载节点时停止解码。由于历史原因和影响,如有可能,我更愿意不改变宏/参数,但如果必须改变,则必须改变。谢谢您抽出时间阅读!

问题:

我的问题是,在使用 Razor 参数时,是否有任何方法可以将 HTML 元素添加到多个文本框中,或者当重新加载节点时停止解码。

由于历史原因和影响,如果可能的话,我更愿意不更改宏/参数,但如果必须更改,则必须更改。感谢您抽出时间阅读!

2个回答

4

我曾遇到类似问题,希望通过一个以textMultiLine为参数的宏来直接将HTML/Javascript插入RTE中。

解决方法是获取标签而不是对它们进行转义:

@Html.Raw(HttpUtility.HtmlDecode(Parameter.Code));

不太确定是否是同一个问题,问题在于“xml blob”在数据库中的存储方式,在解析时,HTML会破坏宏元素,导致将任何其他参数读取为该属性的一部分。 - Les McCutcheon

1
最终,我决定使用一个带有正则表达式的辅助函数来替换自定义HTML元素键,例如用$gt$代替>,用$lt$代替<。
$lt$span$gt$1,2,3 $lt$/span$gt$

这种解决方案并不完美,但它避免了我回退到多个文档类型(而非宏)或富文本编辑器属性,这些方法也可以解决问题。

希望能够帮助其他人节省在此上花费的时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接