我有一个项目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
答案 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