FindView无法正常工作

时间:2011-03-17 12:19:33

标签: asp.net-mvc-3

我有一个帮助类,我用它来创建和发送“HTML电子邮件”。这个类在我的web / Infrastructure / Communication文件夹中。我在项目中创建了一个视图,并使用FindView查找此视图。

public Stream GetViewStream(string viewName, object model, ControllerContext context, ViewDataDictionary viewData, TempDataDictionary tempData)
        {
            var view = ViewEngines.Engines.FindView(context, viewName,"");
            if (view == null)
            {
                throw new InvalidOperationException(string.Format("Could not find a view named '{0}'", viewName));
            }

            var sb = new StringBuilder();
            using (var writer = new StringWriter(sb))
            {
                var viewContext = new ViewContext(context, view.View, viewData, tempData, writer);
                view.Render(viewContext, writer);

                writer.Flush();
            }
            return new MemoryStream(Encoding.UTF8.GetBytes(sb.ToString()));
        }

在我的项目中,我有一个区域文件夹,每个系统都有一个文件夹,在这些文件夹中我有模型,视图和控制器。

现在

我的问题是,当我从我的MailController使用此方法时,它在web / Areas / Mail / Views中搜索正确的视图但是当我在我的AdvisoryController中使用它时,它会在web / Views中搜索视图。

我该如何解决这个问题,为什么会发生这种情况?

1 个答案:

答案 0 :(得分:0)

如果您在课程VirtualPathProviderViewEngine中,尤其是方法FindView,您会看到它使用名为GetPath的方法来获取搜索视图的路径。

事实证明,除非您指定视图的路径(使用“〜”或“/”作为第一个字母),否则它将使用ControllerContext中的区域名称。

这意味着您必须在查看视图之前操纵控制器上下文,或者您自己指定视图。

在初始化时,您可以在视图引擎中查看视图位置路径,但我认为这会引发更多问题而不是解决。