在Orchard中使用FindView

时间:2011-08-08 14:08:19

标签: orchardcms

我正在尝试使用:

var viewEngineResult = ViewEngines.Engines.FindView(ControllerContext, myViewName, null);

作为呈现视图内容以发送格式良好的电子邮件的过程的一部分。我在Orchard Controller里面使用它。我在一个MVC项目中使用了Orchard之外的类似代码并且工作正常。

但是在Orchard运行时,此代码无法找到我正在查找的视图,并返回已搜索0个位置的视图引擎结果。

viewEngineResult在调用后具有以下值:

  • SearchedLocations:Count = 0,
  • 查看:null,
  • ViewEngine:null

有没有理由这在Orchard中不起作用,有没有办法让它起作用?

2 个答案:

答案 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可能不会允许依赖注入正确地执行它的东西。 然后,我只是在猜测。