我正在使用VS 2012和MVC 4.我正在创建一个简单的CMS,因此我的页面内容将从c#代码动态更新。 (带有标记的每个页面的内容将保存在数据库中)。
我不知道的是如何从代码(来自C#控制器)更新@renderbody或@rendersection?
示例:
我有一个母版页:
我有一个从该母版页派生的内容页面:
我想从C#代码中获取所有内容。原因是我的内容将在数据库中,并且会有很多页面,因此内容会根据搜索条件动态变化(我正在创建一个简单的知识库,因此用户可以使用粗体文本,改变文字大小等等。)
修改 感谢您指出我没有提出足够的要求 - 我从数据库中获取内容(包括一些HTML标记),而不是我的页面的HTML。示例: MVC 4 Razor引擎</ b> - 此类内容将在数据库中。
答案 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#编写的降价引擎。你可以调整它。