我需要在我的应用程序中呈现一个特定的 MVC 视图(对于几百个数据库记录 - 每个记录呈现一个视图),每个视图都作为一个字符串,以便我可以将它们保存到 *.html 文件以供离线查看。
我找到了几个关于如何做到这一点的来源:
如何将 ASP.NET MVC ViewResult 呈现为 HTML?
和
http://www.west-wind.com/weblog/posts/2012/May/30/Rendering-ASPNET-MVC-Views-to-String
这似乎只适用于基本视图。我的问题是我的视图调用了 Html.DisplayFor(它呈现了我的自定义显示模板),而这些模板也调用了 Html.DisplayFor。当我使用上面链接中的方法时,似乎正在使用默认显示模板,并且没有为我的视图的这些区域呈现我的 HTML。
请注意,当让 MVC 将它们呈现到 ViewResult 并在屏幕上显示它们时,我试图呈现为字符串的视图可以使用自定义显示模板很好地呈现。
有没有办法将 MVC 视图呈现为字符串,以便可以将其保存到使用自定义显示模板而不是默认值的文件中?我不希望为此专门创建一个不包含自定义显示模板的新视图。任何帮助是极大的赞赏。
这是我的代码示例,仅显示最基本的功能。同样,这适用于基本视图,但不适用于我的自定义显示模板。
public void GenerateOfflinePackage(IndexViewModel model, ControllerContext controllerContext)
{
var folderName = Guid.NewGuid().ToString();
var tempPackagePath = string.Format("{0}\\{1}", this.hostingEnvironmentWrapper.MapPath("~/App_Data"), folderName);
Directory.CreateDirectory(tempPackagePath);
var cpfModel = this.careerPlanningFormService.BuildSummaryViewModel(59);
var viewString = this.RenderRazorViewToString("~/Views/CPF/Summary.cshtml", cpfModel, controllerContext);
using (StreamWriter outfile = new StreamWriter(tempPackagePath + @"\59.html", true))
{
outfile.Write(viewString);
}
}
public string RenderRazorViewToString(string viewName, object model, ControllerContext ctxt)
{
var s = string.Empty;
var viewData = ctxt.Controller.ViewData;
var tempData = ctxt.Controller.TempData;
viewData.Model = model;
using (var sw = new StringWriter())
{
var viewResult = ViewEngines.Engines.FindPartialView(ctxt, viewName);
var viewContext = new ViewContext(ctxt, viewResult.View, viewData, tempData, sw);
viewResult.View.Render(viewContext, sw);
viewResult.ViewEngine.ReleaseView(ctxt, viewResult.View);
s = sw.GetStringBuilder().ToString();
}
return s;
}
示例 ViewModel 和一些包含的类:
public class SummaryViewModel : CareerPlanningFormBase
{
public string StaffName { get; set; }
public string StaffImageUrl { get; set; }
public string PredominantRole { get; set; }
public IList<SummaryResultsMeasuresSectionModel> ResultsMeasuresSections { get; set; }
}
public class SummaryResultsMeasuresSectionModel
{
public string SectionName { get; set; }
public string SectionLabelTitle { get; set; }
public string SectionLabelText { get; set; }
public IList<SummaryResultsMeasureModel> ResultsMeasures { get; set; }
}
public class SummaryResultsMeasureModel
{
public string ResultsMeasureName { get; set; }
public IEnumerable<string> MeasureTypes { get; set; }
public IList<SummaryResultsMeasureCriterionModel> ResultsMeasureCriteria { get; set; }
public IEnumerable<SummaryActionPlanModel> ActionPlans { get; set; }
}