0

我正在使用 VS 2012 和 MVC 4。我正在创建一个简单的 CMS,因此我的页面内容将通过 c# 代码动态更新。(带有标记的每个页面的内容将保存在数据库中)。

我不知道的是如何从代码(来自 C# 控制器)更新 @renderbody 或 @rendersection?

例子:

我有一个母版页:

MVC 4 母版页

我有一个源自该母版页的内容页面:

MVC 4 内容页面

我想从 C# 代码中获取所有这些内容。这样做的原因是我的内容将在数据库中并且会有很多页面,因此内容会根据搜索条件动态变化(我正在创建一个简单的知识库,因此用户将能够加粗文本,更改文本大小等)。

编辑 感谢您指出我没有足够精确地询问 - 我正在从数据库中获取内容(包括一些 HTML 标记),而不是为我的页面获取 HTML。示例:MVC 4 Razor 引擎- 这样的内容将在数据库中。

4

1 回答 1

2

如果您的数据库中有要输出的内容,那么您将从数据库中检索它并将其作为字符串传递给您的视图,就像将传递给视图的任何其他字符串一样。

通常,如果您在视图中输出一个字符串,Razor 引擎将对其进行解释和编码,以便它对客户端“安全”。所以如果你的字符串是“ text ”,它实际上会发送“<b>text</b>”。这将由您的浏览器解释并实际显示给您文本”。

相反,您希望引擎不对字符串进行编码。为此,您可以这样使用Html.Raw(...)

@Html.Raw(Model.MyContentFromMyDatabase)

这样做的问题是它会将 HTML(无论好坏)发送到客户端。

如果 HTML 格式不正确,则您的页面可能无法正确显示。例如:

<b>text

将使文本变为粗体,页面上的其他所有内容也将变为粗体。

如果 HTML 包含恶意代码,例如<script>标签,那么该恶意代码将在客户端上执行。

这就是剃须刀引擎默认对事物进行编码的原因:以确保事物安全。这也是为什么 ASP.NET MVC 默认情况下会在 POST 上阻止<>字符到操作。

这些天来,网站已经转向“降价”。也就是说,如果有人正在输入文本并希望其中的一部分为粗体,则他们不会输入<b>标签。相反,它们用 . 包围文本**。SO就是这样做的。在输出时,**代码被解释并转换为有效的 HTML。

**text**

被转换为

<b>text</b>

StackOverflow 有它的降价语法。GitHub 有自己的版本。如果需要,您可以创建自己的。

MarkdownSharp是一个用 C# 编写的降价引擎。你可以适应它。

于 2013-07-20T02:01:04.013 回答