2013-08-28 44 views
0

我有一个MVC4应用程序,目前使用一个区域(除了正常的位置)。通常情况下,我的路由一切正常,但我现在需要在“根”位置的代码来查找位于该区域内的局部视图。指定区域搜索视图

我的解决方案的文件中的相关部分:

/Areas 
/Areas/Admin 
/Areas/Admin/Views 
/Areas/Admin/Views/Shared/_adminPartialView.cshtml 
/Views 
/Views/Shared/_rootPartialView.cshtml 

而我失败的代码是:

var viewEngine = new RazorViewEngine(); 
var cContext = new ControllerContext(context, new RouteData(), new EmptyController()); 

// this works: 
var rootView = viewEngine.FindPartialView(cContext, "_rootPartialView", false); 
if (rootView == null) { throw new Exception("Root view not found"); } 

// this throws my error: 
var adminView = viewEngine.FindPartialView(cContext, "_adminPartialView", false); 
if (adminView == null) { throw new Exception("Admin view not found"); } 

context以上从HttpContext.Current间接上市)

.. 。这是有道理的,没有一个区域指定管理区域不应该被搜查......但是当我将上面的viewEngine更改为= new AdminRazorViewEngine();,其定义如下:

public class AdminRazorViewEngine : RazorViewEngine { 
    public AdminRazorViewEngine() { 
     var viewLocations = new [] { 
      "~/Areas/Admin/Views/{1}/{0}.cshtml", 
      "~/Areas/Admin/Views/Shared/{0}.cshtml" 
     }; 
     base.ViewLocationFormats = viewLocations.Concat(base.ViewLocationFormats).ToArray(); 
    } 
} 

我仍然得到相同的结果。

如果我将_adminPartialView.cshtml复制到/Views/Shared/那么使用任一视图引擎都可以正确找到两个视图。

我也尝试创建一个实际的RouteData对象,指定它的面积,并使用该构建我的ControllerContext时:

var routeData = new RouteData(); 
routeDate.Values.Add("area", "Admin"); 
// ... 
var cContext = new ControllerContext(context, routeData, new EmptyController()); 

随着行为没有变化。

如何显式指定视图引擎的区域进行搜索?

回答

0

尝试设置AreaViewLocationFormats代替ViewLocationFormats

下面是从ILSpy代码为RazorViewEngine

public RazorViewEngine(IViewPageActivator viewPageActivator) : base(viewPageActivator) 
    { 
     base.AreaViewLocationFormats = new string[] 
     { 
      "~/Areas/{2}/Views/{1}/{0}.cshtml", 
      "~/Areas/{2}/Views/{1}/{0}.vbhtml", 
      "~/Areas/{2}/Views/Shared/{0}.cshtml", 
      "~/Areas/{2}/Views/Shared/{0}.vbhtml" 
     }; 
     base.AreaMasterLocationFormats = new string[] 
     { 
      "~/Areas/{2}/Views/{1}/{0}.cshtml", 
      "~/Areas/{2}/Views/{1}/{0}.vbhtml", 
      "~/Areas/{2}/Views/Shared/{0}.cshtml", 
      "~/Areas/{2}/Views/Shared/{0}.vbhtml" 
     }; 
     base.AreaPartialViewLocationFormats = new string[] 
     { 
      "~/Areas/{2}/Views/{1}/{0}.cshtml", 
      "~/Areas/{2}/Views/{1}/{0}.vbhtml", 
      "~/Areas/{2}/Views/Shared/{0}.cshtml", 
      "~/Areas/{2}/Views/Shared/{0}.vbhtml" 
     }; 
     base.ViewLocationFormats = new string[] 
     { 
      "~/Views/{1}/{0}.cshtml", 
      "~/Views/{1}/{0}.vbhtml", 
      "~/Views/Shared/{0}.cshtml", 
      "~/Views/Shared/{0}.vbhtml" 
     }; 
     base.MasterLocationFormats = new string[] 
     { 
      "~/Views/{1}/{0}.cshtml", 
      "~/Views/{1}/{0}.vbhtml", 
      "~/Views/Shared/{0}.cshtml", 
      "~/Views/Shared/{0}.vbhtml" 
     }; 
     base.PartialViewLocationFormats = new string[] 
     { 
      "~/Views/{1}/{0}.cshtml", 
      "~/Views/{1}/{0}.vbhtml", 
      "~/Views/Shared/{0}.cshtml", 
      "~/Views/Shared/{0}.vbhtml" 
     }; 
     base.FileExtensions = new string[] 
     { 
      "cshtml", 
      "vbhtml" 
     }; 
    } 
+1

D'哦。我正在寻找部分视图,但不添加到PartialViewLocationFormats – DaveD