2013-05-29 33 views
0

我需要在我的应用程序中渲染特定的MVC视图(对于几百个数据库记录 - 每个记录呈现一个视图),每个视为一个字符串,可以将它们保存为* .html文件以供离线查看。当渲染视图为字符串时,ASP.NET MVC不渲染自定义显示模板

我已经找到了如何做到这一点的几个来源:

How to render an ASP.NET MVC ViewResult to HTML?

http://www.west-wind.com/weblog/posts/2012/May/30/Rendering-ASPNET-MVC-Views-to-String

这似乎很好地工作只是基本的观点。我的问题是我的视图调用Html.DisplayFor(它呈现我的自定义显示模板),并且这些模板也调用Html.DisplayFor。当我在上面的链接中使用方法时,它似乎正在使用默认的显示模板,并且我的视图的这些区域没有呈现任何MY 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; 
} 

例视图模型和一些包括类:

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; } 
} 

回答

1

如果我是你,我会借此从不同的方法。执行子操作方法输出缓存,然后创建自定义缓存提供程序,以保存到磁盘并从中读取。这样你就可以获得渲染的输出并将其存储到磁盘。我有一个博客条目,可以引导您阅读。

http://www.haneycodes.net/custom-output-caching-with-mvc3-and-net-4-0-done-right

+0

我可能失去了一些东西,但我不认为这将如何帮助。我不是按照每页/每个请求的方式执行此操作。我点击一个按钮并调用一个方法,它将遍历数百条记录和每条记录,呈现一个视图并将生成的HTML保存为一个文件。最终产生几百个HTML文件 - 全部在一个请求中。 最终的游戏是,应用程序将生成一个链接到所有这些文件的索引文件,它将全部压缩并提供给用户在旅行和离线(即在飞行中)时查看数据。这是很容易的部分。 –

+0

生成的视图 - 是否来自控制器上的ActionResult/ActionMethod? – Haney

+0

正在生成脱机包的用户将在管理员屏幕上单击一个按钮。处理POST的控制器操作方法将对GenerateOfflinePackage进行服务方法调用。该方法将完成所有工作,生成视图,保存视图等(请参阅我的原始帖子,仅举一个记录)。在服务方法完成后,处理POST的控制器只需为用户做一次重定向。 –