我正在尝试使用:
var viewEngineResult = ViewEngines.Engines.FindView(ControllerContext, myViewName, null);
作为呈现视图内容以发送格式良好的电子邮件的过程的一部分。我在Orchard Controller里面使用它。我在一个MVC项目中使用了Orchard之外的类似代码并且工作正常。
但是在Orchard运行时,此代码无法找到我正在查找的视图,并返回已搜索0个位置的视图引擎结果。
viewEngineResult在调用后具有以下值:
有没有理由这在Orchard中不起作用,有没有办法让它起作用?
答案 0 :(得分:6)
这个答案是基于Bertrand给我的建议,但我想把它与我发现的东西结合在一起。
为了能够使用FindPartialView,我需要将IViewEngineProvider的实例注入我的控制器。
然后我使用以下代码来解析和呈现视图:
private String RenderView(String viewName, object model)
{
var paths = new List<string>(); // This can just be an empty list and it still finds it.
var viewEngine = _viewEngineProvider.CreateModulesViewEngine(new CreateModulesViewEngineParams {VirtualPaths = paths});
var viewResult = viewEngine.FindPartialView(ControllerContext, viewName, false);
if (viewResult.View == null) {
throw new Exception("Couldn't find view " + viewName);
}
var viewData = new ViewDataDictionary {Model = model};
using (var sw = new StringWriter())
{
var viewContext = new ViewContext(ControllerContext, viewResult.View, viewData, TempData, sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
答案 1 :(得分:4)
我想你想仔细看看Orchard.Framework / Mvc / ViewEngines,特别是IViewEngineProvider和ThemeAwareViewEngine。在Orchard中还有很多事情要做,例如主题,多租户以及一般来说可能需要更丰富的环境来完成这项工作。 这里可能发生的是视图引擎没有足够的信息来解析视图,因此选择退出链。您可能希望将断点放入ThemeAwareViewEngine.FindView,然后检查该类的私有依赖项字段。如果它们是null,我不会感到惊讶,因为通过静态获取FindView可能不会允许依赖注入正确地执行它的东西。 然后,我只是在猜测。