Orchardcms 在果园中使用FindView

Orchardcms 在果园中使用FindView,orchardcms,Orchardcms,我正在尝试使用: var viewEngineResult = ViewEngines.Engines.FindView(ControllerContext, myViewName, null); 作为呈现视图内容以发送格式良好的电子邮件的过程的一部分。我在果园控制器中使用它。我在一个MVC项目中使用了Orchard之外的类似代码,效果很好 但是,在Orchard中,运行此代码无法找到我正在查找的视图,并返回已搜索0个位置的视图引擎结果 调用viewEngineResult后,它具有以下值:

我正在尝试使用:

var viewEngineResult = ViewEngines.Engines.FindView(ControllerContext, myViewName, null);
作为呈现视图内容以发送格式良好的电子邮件的过程的一部分。我在果园控制器中使用它。我在一个MVC项目中使用了Orchard之外的类似代码,效果很好

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

调用viewEngineResult后,它具有以下值:

  • 搜索位置:计数=0
  • 视图:空
  • 视图引擎:空

这在Orchard中不起作用有什么原因吗?有什么方法可以让它起作用吗?

我想你应该仔细看看Orchard.Framework/Mvc/ViewEngines,特别是IViewEngineProvider和MaawareViewEngine。在果园里还有很多事情要做,比如主题、多租户,以及一个更丰富的环境,这些都是实现这一目标所需要的。 这里可能发生的情况是视图引擎没有足够的信息来解析视图,因此选择退出该链。您可能希望在meawareviewEngine.FindView中放置一个断点,然后检查该类的私有依赖项字段。如果它们为null,我不会感到惊讶,因为通过静态访问FindView可能不允许依赖项注入正确地完成它的工作。
我只是在猜测。

这个答案是基于伯特兰给我的建议,但我想把它和我的发现结合起来

为了能够使用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();
    }
}
private String RenderView(字符串视图名称,对象模型)
{
var path=new List();//这可能只是一个空列表,但它仍然可以找到它。
var viewEngine=_viewEngineProvider.CreateModulesViewEngine(新的CreateModulesViewEngineParams{VirtualPath=Path});
var viewResult=viewEngine.FindPartialView(ControllerContext,viewName,false);
if(viewResult.View==null){
抛出新异常(“找不到视图”+视图名称);
}
var viewData=newviewdatadictionary{Model=Model};
使用(var sw=new StringWriter())
{
var viewContext=新的viewContext(ControllerContext、viewResult.View、viewData、TempData、sw);
viewResult.View.Render(viewContext,sw);
返回sw.GetStringBuilder().ToString();
}
}

private dependency字段看起来都很好,但它将当前主题设置为null,因此似乎丢失了。我尝试添加~/并给出我的视图的完整路径,这使得它可以使用搜索引擎在正确的位置进行搜索,但它仍然没有找到视图。是否有一种方法可以连接到部件模板,并使用这些模板获取我的电子邮件内容?您是否尝试将IViewEngineProvider的实例注入到您自己的代码中并从那里开始,而不是使用常规MVC API中的静态调用?现在似乎越来越近了。我正在使用注入式IViewEngineProvider创建模块视图引擎。这需要一个包含虚拟路径集合的CreateModulesViewEngineParams对象。有没有办法,或者我走错方向了。我不确定。你有没有试着跟踪它的现有用法?我还没有找到一个真正清晰的用法示例,但我会继续挖掘和修改。感谢您的帮助。不幸的是,Orchard 1.10.1不起作用,空的
路径
导致异常。我相信您可以简单地注入
IThemeAwareViewEngine
并使用其
FindPartialView
方法。