使用Razor - ASPNET MVC开发标准模板

时间:2015-02-05 16:23:47

标签: c# asp.net-mvc razor

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

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

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

问题是我在数据库结构中存储已经包含对我的Models,ViewBag,Helpers等的引用。当渲染浏览器时无法识别Razor元素(此外,在我的视图中,编译器不执行{{1显式那里,即使我已经将它插入数据库记录旁边。)

有人可以帮助我吗?

数据库中的HTML代码

RenderBody()

控制器代码:

<!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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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