我无法在没有控制器类的情况下使用“RenderPartialViewToString”。C#渲染不带控制器的局部视图
我目前不得不在应用程序启动时创建HTML,这需要制作模型,制作视图并将视图转换为HTML字符串。
在我看来,它使用的HTML Helper函数/扩展,似乎只有在那里,如果有控制器。
任何人都可以阐明我如何做到这一点?
我无法在没有控制器类的情况下使用“RenderPartialViewToString”。C#渲染不带控制器的局部视图
我目前不得不在应用程序启动时创建HTML,这需要制作模型,制作视图并将视图转换为HTML字符串。
在我看来,它使用的HTML Helper函数/扩展,似乎只有在那里,如果有控制器。
任何人都可以阐明我如何做到这一点?
现在已弃用Razor.Parse。剃刀引擎的3.5版本,你会遵循的步骤此处概述: https://antaris.github.io/RazorEngine/Upgrading.html
下面的文本是逐字从上面的链接复制:当modeltype已知或者你
var result = Razor.Parse(razorTemplate, model, cache_name)
现在是(要预编译在启动时)
// Once at startup (not required when using an ITemplateManager which knows how to resolve cache_name)
Engine.Razor.AddTemplate(cache_name, razorTemplate)
// On startup
Engine.Razor.Compile(cache_name, typeof(MyModel) /* or model.GetType() or null for 'dynamic'*/)
// instead of the Razor.Parse call
var result = Engine.Razor.Run(cache_name, typeof(MyModel) /* or model.GetType() or null for 'dynamic'*/, model)
或(当你想偷懒编译,就像解析)
// Once at startup (not required when using an ITemplateManager which knows how to resolve cache_name)
Engine.Razor.AddTemplate(cache_name, razorTemplate)
// instead of the Razor.Parse call
var result = Engine.Razor.RunCompile(cache_name, typeof(MyModel) /* or model.GetType() or null for 'dynamic'*/, model)
语义相当于一个班轮将是(只用于快速上手使用RazorEngine):
// This will just call AddTemplate for you (every time), note that the ITemplateManager has to support AddTemplate
// and it has to handle multiple calls to AddTemplate gracefully to make this work.
// The default implementation will throw an exception when you use the same cache_name for different templates.
var result = Engine.Razor.RunCompile(razorTemplate, cache_name, model.GetType() /* typeof(MyModel) or or null for 'dynamic'*/, model
你不能没有电流控制器context.Try使用HTML帮助这个扩展的呈现视图到HTML
public static class RenderViewHelper
{
public static string RenderPartialToString(string viewPath, object model)
{
string viewAbsolutePath = MapPath(viewPath);
var viewSource = File.ReadAllText(viewAbsolutePath);
string renderedText = Razor.Parse(viewSource, model);
return renderedText;
}
public static string RenderPartialToString(ControllerContext context, string partialViewName, object model)
{
ViewEngineResult result = ViewEngines.Engines.FindPartialView(context, partialViewName);
var viewData = new ViewDataDictionary() { Model = model };
if (result.View != null)
{
var sb = new StringBuilder();
using (var sw = new StringWriter(sb))
{
using (var output = new HtmlTextWriter(sw))
{
var viewContext = new ViewContext(context, result.View, viewData, new TempDataDictionary(), output);
result.View.Render(viewContext, output);
}
}
return sb.ToString();
}
return string.Empty;
}
public static string MapPath(string filePath)
{
return HttpContext.Current != null ? HttpContext.Current.Server.MapPath(filePath) : string.Format("{0}{1}", AppDomain.CurrentDomain.BaseDirectory, filePath.Replace("~", string.Empty).TrimStart('/'));
}
}
第一种方法使用剃刀引擎库。第二个工作与控制器环境。
一个很漂亮的回答这个问题是Westwind.Web.Mvc.ViewRenderer。
说明: 如果您想渲染MVC以外的视图,您需要完全可用的ControllerContext,并且Razor可以从中获取所有信息。
通过使用视图解析器类,你才可以调用此方法通过传递模型和视图数据字典视图渲染:
public class EmptyController : Controller { }
public static string RenderRazorViewToString(string viewName, [Optional] object model,[Optional] ViewDataDictionary viewData)
{
var controller = ViewRenderer.CreateController<EmptyController>();
controller.ViewData =viewData??new ViewDataDictionary();
controller.ViewData.Model = model;
var context = controller.ControllerContext;
var html = ViewRenderer.RenderView(viewName, model, context);
return html;
}
我希望这会有所帮助。
享受:)
EmptyController包含在ViewRenderer.cs源文件中。可以删除。 – pixparker
您需要'HttpContext.Current'才能为ViewRenderer提供完整的功能值。当控制器在Web服务器中运行时,您可以使用它很长时间。对于单元测试(没有web服务器和HttpContext.Current == null),我试图解决它,但总是以相同的NullReferenceException深入MVC代码没有进一步的信息。相反,我最终使用了RazorEngine,因为它在有和没有HttpContext的情况下都有效。 – Manfred
@Manfred谢谢。我有与空HttpContext相同的问题。你有RazorEngine的工作示例链接吗? – pixparker
不能reoslve符号 “剃刀” 在 “Razor.Parse” – LmC
下载剃刀引擎库。 – user3257812
从Nuget'Install-Package RazorEngine'或访问他们的页面https://github.com/Antaris/RazorEngine – Jimbo