来自C#代码的@renderbody和@rendersection

时间:2013-07-19 22:11:18

标签: c# asp.net-mvc asp.net-mvc-4 razor

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

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

示例:

我有一个母版页:

MVC 4 master page

我有一个从该母版页派生的内容页面:

MVC 4 content page

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

修改 感谢您指出我没有提出足够的要求 - 我从数据库中获取内容(包括一些HTML标记),而不是我的页面的HTML。示例: MVC 4 Razor引擎<​​/ b> - 此类内容将在数据库中。

1 个答案:

答案 0 :(得分:2)

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

通常情况下,如果在视图中输出一个字符串,Razor引擎会对其进行解释并编码,以使其对客户端“安全”。因此,如果您的字符串是“ text ”,它实际上会发送“&lt; b&gt; text&lt; / b&gt;”。这将由您的浏览器解释,并实际显示给您文字”。

相反,您希望引擎不对字符串进行编码。为此,您可以使用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#编写的降价引擎。你可以调整它。