Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET MVC在将视图呈现为字符串时不呈现自定义显示模板_C#_Asp.net_Asp.net Mvc - Fatal编程技术网

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

C# ASP.NET MVC在将视图呈现为字符串时不呈现自定义显示模板,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我需要在我的应用程序中呈现一个特定的MVC视图(对于几百条数据库记录,每个记录呈现一个视图),每个视图都作为字符串,这样我就可以将它们保存到*.html文件中以供脱机查看 我找到了一些关于如何做到这一点的来源: 及 这似乎只适用于基本视图。我的问题是我的视图调用Html.DisplayFor(它呈现我的自定义显示模板),这些模板也调用Html.DisplayFor。当我使用上面链接中的方法时,似乎正在使用默认的显示模板,并且没有为视图的这些区域呈现任何HTML 请注意,当让MVC将视图渲染为

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

我找到了一些关于如何做到这一点的来源:

这似乎只适用于基本视图。我的问题是我的视图调用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; }
}
公共类摘要视图模型:CareerPlanningFormBase
{
公共字符串StaffName{get;set;}
公共字符串StaffImageUrl{get;set;}
公共字符串控制{get;set;}
公共IList ResultsMeasureSections{get;set;}
}
公共类SummaryResultsMeasuresActionModel
{
公共字符串SectionName{get;set;}
公共字符串部分LabelTitle{get;set;}
公共字符串SectionLabelText{get;set;}
公共IList ResultsMeasures{get;set;}
}
公共类SummaryResultsMeasureModel
{
公共字符串ResultsMeasureName{get;set;}
公共IEnumerable MeasureType{get;set;}
公共IList ResultsMeasureCriteria{get;set;}
公共IEnumerable操作计划{get;set;}
}

如果我是你,我会从另一个角度看待这个问题。执行子操作方法输出缓存,然后创建保存到磁盘和从磁盘读取的自定义缓存提供程序。这样,您将获取渲染输出并将其存储到磁盘。我有一篇博客文章可以带你浏览


我可能遗漏了一些东西,但我看不出这会有什么帮助。我不是在每页/每项请求的基础上这样做的。我单击一个按钮并调用一个方法,该方法将遍历数百条记录,对于每条记录,呈现一个视图并将生成的HTML保存为文件。最终在一个请求中生成数百个HTML文件。最终,应用程序将生成一个链接到所有这些文件的索引文件,所有文件都将被压缩并提供给用户,以便在旅行和离线(即飞行中)时查看数据。这是最简单的部分。生成的视图-是否来自控制器上的ActionResult/ActionMethod?生成脱机包的用户将单击管理屏幕上的按钮。处理POST的控制器操作方法将对GenerateOfflinePackage进行服务方法调用。该方法将完成所有工作,生成视图,保存它们,等等(请参阅我的原始帖子,以获取只做一条记录的示例)。在服务方法完成后,处理POST的控制器只为用户执行重定向。如果您说您的操作方法产生了许多输出/保存,那么输出缓存可能不会对您有多大帮助。是的,这是正确的,它会产生很多。不过,谢谢你的帮助。