4

我有一个有趣的问题。我有一个发送电子邮件的网站。电子邮件模板通常是直截了当的,但对于一位客户,他希望我将他的公共网站上的内容转换为电子邮件友好的 html。

我不仅要解决他特定网站的问题,还要解决其他未知网站的问题。所以我记得你可以将 Razor 作为模板引擎运行。

长话短说。它正在运行并且运行良好。我的问题归结为这一点。当有人用剃刀风格的循环编辑模板时,Ckeditor 的行为非常奇怪。

知道如何防止 CKEditor 搞砸吗?

<table style="width: 100%;" width="100%">
<tbody>
@foreach (var row in body.indexPageRow) { 
foreach (var cell in row.teaser) {
    <tr>
        <td class="row">@Raw(cell.teaserContent.a.Html)</td>
        <td class="row">@Raw(cell.teaserContent.div.InnerHtml)</td>
    </tr>
    }}
</tbody>
</table>

上面的代码保存在ckeditor中时去掉了razor信息,变成了一个空表

<table style="width: 100%;" width="100%">
    <tbody></tbody>
</table>
4

2 回答 2

4

我能想到的唯一方法是结合使用 html 注释和 razor 注释。

最初,您会像这样编写剃刀模板:

@{
    Layout = null;
}

<!DOCTYPE html>
<html>
<head>
    <title>Index</title>
</head>
<body>
<table>
<tbody>
    <tr><td>X</td><td>Y</td></tr>
@*<!--*@
    @for (var x = 1; x < 5; x++) { 
    for (var y = 1; y < 5; y++) {
@*-->*@
    <tr>
        <td class="row">@Html.Raw(x)</td>
        <td class="row">@Html.Raw(y)</td>
    </tr>
@*<!--*@
    }
}
@*-->*@
</tbody>
</table>
</body>
</html>

上面的代码是有效的,并且将无错误地呈现。但是当你把它放入 html 编辑器时,它会被浏览器重新排列,所以你需要在它显示进行编辑之前对其进行更改,以便删除 razor 注释而只保留 html 注释。

因此,一旦您通过替换with 的所有实例和@*<!--*@with的所有实例来删除剃刀评论,您应该具有以下内容<!--@*-->*@-->

<!DOCTYPE html>
<html>
<head>
    <title>Index</title>
</head>
<body>
<table>
<tbody>
    <tr><td>X</td><td>Y</td></tr>
<!--
    @for (var x = 1; x < 5; x++) { 
    for (var y = 1; y < 5; y++) {
-->
    <tr>
        <td class="row">@Html.Raw(x)</td>
        <td class="row">@Html.Raw(y)</td>
    </tr>
<!--
    }
}
-->
</tbody>
</table>
</body>
</html>

这将在 html 编辑器中呈现,并且不会被浏览器破坏,正如 Alfonso 指出的那样,这是 jsfiddle http://jsfiddle.net/wPGLd/3/上的一个示例

编辑完成后,您将需要捕获 html 并通过替换 with 的所有实例和 with 的所有实例来重新<!--应用@*<!--*@剃刀-->评论@*-->*@

在进入 ckeditor 之前和之后截取 html 是相当直接的并且有据可查。我发现以下文章解释了如何在提交时获取 ckeditor 内容

如何在表单提交时更新 CKEditor 内容——相当于 OnAfterLinkedFieldUpdate FCKEditor

以下问题也涵盖了这一点

在 CKEditor 插件中保存之前立即更新编辑器内容

于 2013-09-10T11:29:51.893 回答
0

你不能。

浏览器将重新排列这些内容:http: //jsfiddle.net/wPGLd/

<!DOCTYPE html>
<html>
<head>
<script type='text/javascript'>//<![CDATA[ 
window.onload=function(){
alert(document.body.innerHTML)
}//]]>  
</script>
</head>
<body>
  <table style="width: 100%;" width="100%">
<tbody>
@foreach (var row in body.indexPageRow) { 
foreach (var cell in row.teaser) {
    <tr>
        <td class="row">@Raw(cell.teaserContent.a.Html)</td>
        <td class="row">@Raw(cell.teaserContent.div.InnerHtml)</td>
    </tr>
    }}
</tbody>
</table>

</body>
</html>
于 2013-05-03T07:51:26.603 回答