我正在尝试从数据库动态呈现页面。视图看起来像这样
@model MyModel
@{
ViewBag.Title = Model.Title;
Layout = Layout = "~/Views/Shared/_PageInnerLayout.cshtml";
}
@MvcHtmlString.Create(Model.Content)
MyModel只有3个属性; Id, Title and Content
如果Content
只有HTML,那么视图渲染就可以了。但在某些情况下,我也需要渲染部分内容。因此Content
可能包含类似
@{
Html.RenderPartial("_FooterPartial");
}
这不起作用。它按字面意思呈现,如下图所示
如何解决此问题以便正确呈现页面?
答案 0 :(得分:1)
问题在于Html.RenderPartial
和Html.Partial
辅助方法之间的区别。 RenderPartial
直接将结果写入HttpContext.Response
,Partial
将其作为MvcHtmlString
返回。您需要将RenderPartial
替换为Partial
,将RenderAction
替换为Action
。
<强>编辑:强>
如果包含剃刀视图脚本,则需要呈现内容。如果是这样,则意味着您实际上将views
或partial views
存储在数据库中。您可以创建新的VirtualPathProvider
以帮助从数据库加载视图。有关详细信息,请参阅ASP.NET MVC load the Razor views from database和ASP.NET MVC and virtual view
答案 1 :(得分:0)
我尝试使用VirtualPathProvider执行此操作,但它不起作用。
最后,我所做的是将数据库中的内容写入临时视图,然后渲染视图。它工作
public ActionResult DynamicPage(int id) {
var dynamicPage = new PagesContext().Pages.FirstOrDefault(s => s.Id == id);
string webroot = Server.MapPath("~").TrimEnd('\\');
string fileName = webroot + "\\Views\\\\Solutions\\Temp.cshtml";
System.IO.File.WriteAllText(fileName, dynamicPage.Content);
return View("Temp");
}
这里,dynamicPage的Content属性包含HTML(包括Razor代码)