ASP.NET MVC4 @ MvcHtmlString.Create()与@ Html.RenderPartial()一起出现问题

时间:2013-12-07 05:49:46

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

我正在尝试从数据库动态呈现页面。视图看起来像这样

@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");
}

这不起作用。它按字面意思呈现,如下图所示

Example of rendered page

如何解决此问题以便正确呈现页面?

2 个答案:

答案 0 :(得分:1)

问题在于Html.RenderPartialHtml.Partial辅助方法之间的区别。 RenderPartial直接将结果写入HttpContext.ResponsePartial将其作为MvcHtmlString返回。您需要将RenderPartial替换为Partial,将RenderAction替换为Action

<强>编辑:

如果包含剃刀视图脚本,则需要呈现内容。如果是这样,则意味着您实际上将viewspartial views存储在数据库中。您可以创建新的VirtualPathProvider以帮助从数据库加载视图。有关详细信息,请参阅ASP.NET MVC load the Razor views from databaseASP.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代码)