首页 文章

在将视图呈现为字符串时,ASP.NET MVC不呈现自定义显示模板

提问于
浏览
0

我需要在我的应用程序中呈现一个特定的MVC视图(对于几百个数据库记录 - 每个记录呈现一个视图),每个视图都作为字符串,以便我可以将它们保存到* .html文件以供离线查看 .

我找到了几个关于如何做到这一点的消息来源:

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

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

1 回答

相关问题