【问题标题】:@renderbody and @rendersection from C# codeC# 代码中的 @renderbody 和 @rendersection
【发布时间】:2013-08-02 02:08:18
【问题描述】:

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

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

例子:

我有一个母版页:

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

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

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

【问题讨论】:

  • 如果您将 HTML 存储在您的数据库中,您以后将很难更新任何 HTML。为什么不直接将所需的数据保存在数据库中,并通过从数据库中读取页面数据来动态生成 HTML。这通常是如何完成的。这使您可以稍后更新 HTML 或更改主题等。
  • 然后你可以使用@Html.Raw(...)在你的视图中输出你的原始HTML。但是,请小心,因为恶意 HTML 可能会插入到您的数据库中,然后会发送给毫无戒心的客户端。
  • 不同之处在于 SO 内容不是直接的 HTML 标记。它是一种特殊标记,在输出中处理并转换为 HTML。

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


【解决方案1】:

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

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

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

@Html.Raw(Model.MyContentFromMyDatabase)

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

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

<b>text

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

如果 HTML 包含恶意代码,例如 &lt;script&gt; 标记,则该恶意代码将在客户端上执行。

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

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

**text**

转换为

<b>text</b>

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

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

【讨论】:

  • 非常感谢这个精彩的回答。我也一定会注意安全的。起初,安全并不是我的想法。还有一个问题:如果用户输入 **text 而不是应有的内容怎么办?我猜 Markdown 内部有一些机制来检查标签的正确形成?所以 **text 不会被解析成 text?
  • 正确。很可能它会保留为**text
  • 虽然创建(或重用现有)markdown 引擎是一个选项,但您还可以轻松扩展现有的 ASP.NET Razor 视图引擎并从其他来源(如嵌入式资源甚至数据库)拉取视图,方法是使用一个自定义的 VirtualPathProvider。查看这个问题和答案提供的两个链接:stackoverflow.com/questions/4218454/…
猜你喜欢
  • 2013-01-12
  • 2013-08-21
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多