我有一个帮助类,我用它来创建和发送“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中搜索视图。
我该如何解决这个问题,为什么会发生这种情况?
答案 0 :(得分:0)
如果您在课程VirtualPathProviderViewEngine
中,尤其是方法FindView
,您会看到它使用名为GetPath
的方法来获取搜索视图的路径。
事实证明,除非您指定视图的路径(使用“〜”或“/”作为第一个字母),否则它将使用ControllerContext
中的区域名称。
这意味着您必须在查看视图之前操纵控制器上下文,或者您自己指定视图。
在初始化时,您可以在视图引擎中查看视图位置路径,但我认为这会引发更多问题而不是解决。