【问题标题】:Develop standard template using Razor - ASPNET MVC使用 Razor 开发标准模板 - ASPNET MVC
【发布时间】:2015-02-07 02:02:12
【问题描述】:

我有一个项目 ASPNET MVC5 使用 C# 通过项目定义已经消失,同意将页面布局的结构存储在数据库中。

_Layouts.cshtml 将引用我的 _ViewStart 内部,这将是页面的常见内容。到目前为止一切顺利,问题在于内容将是从数据库中获取站点结构,包含所有 HTML 和 Razor 元素,并呈现在屏幕上。在简单的 HTML 中(当没有 Razor 时),这适用于以下一些替代方案(视图 _layouts.cshtml 代码,其中 ConteudoHTML 将从银行中查找并由控制器返回):

  • @ViewBag.ConteudoHTML@Html.Raw(ViewBag.ConteudoHTML.ToString())
  • 创建一些 Helper 并在视图中调用:@MeuHelper.Template(ViewBag.ConteudoHTML.ToString())

问题是我存储在数据库结构中已经包含对我的模型、ViewBag、Helper 等的引用。渲染时浏览器无法识别 Razor 元素(此外,在我看来,如果没有RenderBody(),编译器将无法执行明确的,即使我已经将它插入到数据库记录旁边)。

谁能帮帮我?

数据库中的 HTML 代码

<!DOCTYPE html>
<html lang="pt-br" xmlns="http://www.w3.org/1999/xhtml" xml:lang="pt-br">
<head>
    <meta charset="utf-8" />    
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description" content="@ViewBag.MetaDescription" />
    <meta name="keywords" content="@ViewBag.MetaKeywords" />   
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <title>@ViewBag.Title</title>                
    <!--[if IE]><link rel="shortcut icon" href="~/css/images/favicon.ico"><![endif]-->
    <link rel="icon" href="@Url.Content("~/css/images/favicon.png")" />
    <link rel="stylesheet" type="text/css" href="@Url.Content("~/css/bootstrap.min.css")" />
@RenderSection("Css", required: false)
</head>

<body>
    @RenderBody()
</body>
</html>

控制器代码:

public virtual ActionResult Index()    
{
    ViewBag.ConteudoHTML = "";//HTML vindo do banco, html acima
    ViewBag.Title = "Meu título";
    ViewBag.MetaDescription = "Description";
    ViewBag.MetaKeywords = "Keywords";
    return View();
}

查看代码 (_Layouts.cshtml)

@ViewBag.ConteudoHTML

【问题讨论】:

标签: c# asp.net-mvc razor


【解决方案1】:

有关将 Razor 视图解析为 HTML 的方法,请参阅 this question。简而言之,您使用视图引擎来查找您的视图,为其创建上下文,并使用该上下文来呈现视图,以便获得 HTML 结果。

您为什么决定使用存储在数据库中的 HTML?这听起来像是一条非常糟糕的路径,它会使您的页面加载时间更长并且很难维护。

你真的应该为你的公共代码使用一个布局页面,这会让事情变得更简单。

【讨论】:

  • 我希望用户能够自定义视图,但他们不能访问 Web 解决方案或源代码。
  • 我查看了您在 VirtualPathProvider 上的帖子,虽然我还没有测试过,但我会担心安全性。我不知道您希望为您的用户提供哪些类型的自定义,但如果他们有机会向视图提供代码或输入,那么您必须准备好应对 SQL 注入的巨大风险。也许 Javascript 模板库会更符合您的需求?如果您需要复杂的视图自定义,您可以动态创建 JavaScript,对于简单的情况,您可以将自定义存储为 JSON。
【解决方案2】:

Razor 视图在使用之前进行编译。您正在尝试将字符串作为代码注入到视图中,但这直到视图编译后才会发生。您需要一种动态创建剃刀视图的方法,以便执行您想做的事情。话虽如此,将您的标记存储在数据库中是一种主要的代码气味。

【讨论】:

【解决方案3】:

我使用 VirtualPathProvider 解决了我的问题。

参考:http://www.umbraworks.net/bl0g/rebuildall/2009/11/17/ASP_NET_MVC_and_virtual_views

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多