未找到可插拔区域的剃刀视图

时间:2013-09-07 08:31:49

标签: asp.net-mvc-4 razor asp.net-mvc-areas buildmanager

我正在开发一个可插入的ASP.NET MVC Web应用程序,它可以在Areas目录中发现并注册运行区域。

我的问题是视图引擎找不到该区域的任何视图。

我有一个位于

的局部视图
  

〜/地区/目录/查看/共享/ _SearchBarPartial.cshtml

我使用以下方式设置区域:

htmlHelper.ViewContext.RouteData.DataTokens["area"] = "Catalog";

但执行时

Html.Partial("_SearchBarPartial")

我收到以下错误:

  

未找到部分视图“_SearchBarPartial”或视图引擎不支持搜索的位置。以下地点是   搜寻:

     

〜/地区/目录/查看/主页/ _SearchBarPartial.aspx   〜/地区/目录/浏览/首页/ _SearchBarPartial.ascx   〜/地区/目录/查看/共享/ _SearchBarPartial.aspx   〜/地区/目录/查看/共享/ _SearchBarPartial.ascx   〜/浏览/首页/ _SearchBarPartial.aspx   〜/浏览/首页/ _SearchBarPartial.ascx   〜/查看/共享/ _SearchBarPartial.aspx   〜/查看/共享/ _SearchBarPartial.ascx   〜/地区/目录/浏览/首页/ _SearchBarPartial.cshtml   〜/地区/目录/浏览/首页/ _SearchBarPartial.vbhtml   〜/地区/目录/查看/共享/ _SearchBarPartial.cshtml   〜/地区/目录/查看/共享/ _SearchBarPartial.vbhtml   〜/浏览/首页/ _SearchBarPartial.cshtml   〜/浏览/首页/ _SearchBarPartial.vbhtml   〜/查看/共享/ _SearchBarPartial.cshtml   〜/查看/共享/ _SearchBarPartial.vbhtml

我的文件夹结构是:

bin/
Areas/
    Catalog/
        bin/
            CatalogArea.dll
        Content/
        Scripts/
        Views/
            Shared/
                _SearchBarPartial.cshtml
         CatalogArea.cs
Content/
Scrips/
Views/
Global.asax

要注册区域,我使用以下代码,在应用程序启动之前执行:

   [assembly: WebActivatorEx.PreApplicationStartMethod(typeof(Bootstrapper), "LoadAreas")]

    public class Bootstrapper
    {

        public static string ModuleDirectory
        {
            get { return Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Areas"); }
         }

        public static void LoadAreas()
        {
            var assemblyFiles = Directory.GetFiles(ModuleDirectory, "*.dll", SearchOption.AllDirectories);

            assemblyFiles.ForEach(af =>
            {
                var assembly = Assembly.LoadFile(af);
                if(assembly.GetTypes().Any(t => IsArea(t))
                {
                    BuildManager.AddReferencedAssembly(assembly);
                }
            });
        }

        private static bool IsArea(Type t)
        {
            return typeof (AreaRegistration).IsAssignableFrom(t) && !t.IsAbstract;
        }
    }

的Global.asax.cs

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        // ...
     }
 }

1 个答案:

答案 0 :(得分:1)

您可以在Global.asax.cs中添加自定义RazorViewEngine。例如:

RazorViewEngine objRazorViewEngine = new RazorViewEngine();
objRazorViewEngine.PartialViewLocationFormats = new string[]
{
"~/Areas/Catalog/Views/Shared/{0}.cshtml"
};
ViewEngines.Engines.Add(objRazorViewEngine);