2010-05-06 20 views
1

我使用了下面的ASP.NET MVC v1和v2以下的代码,但是当我今天向我的应用程序添加了Area时,该区域的控制器不能“ t在我的Areas/Views/controllerView文件夹中找到任何视图。它发布了非常着名的例外情况,它搜索了这4个标准文件夹,但没有看到区域下方。ASP.NET MVC 2中的自定义视图引擎不能与区域一起工作

如何更改代码以便它可以与区域一起使用?也许在ASP.NET MVC 2支持区域自定义视图引擎的例子?关于它在网络上的信息是非常scarse ..

下面的代码:

public class PendingViewEngine : VirtualPathProviderViewEngine 
{ 
    public PendingViewEngine() 
    { 
     // This is where we tell MVC where to look for our files. 
     /* {0} = view name or master page name  
     * {1} = controller name  */ 
     MasterLocationFormats = new[] {"~/Views/Shared/{0}.master", "~/Views/{0}.master"}; 
     ViewLocationFormats = new[] 
           { 
            "~/Views/{1}/{0}.aspx", "~/Views/Shared/{0}.aspx", "~/Views/Shared/{0}.ascx", 
            "~/Views/{1}/{0}.ascx" 
           }; 
     PartialViewLocationFormats = new[] {"~/Views/{1}/{0}.ascx", "~/Views/Shared/{0}.ascx"}; 
    } 

    protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath) 
    { 
     return new WebFormView(partialPath, ""); 
    } 

    protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath) 
    { 
     return new WebFormView(viewPath, masterPath); 
    } 
} 

回答

0

当你创建了一个区域,它是否创造AreaRegistration类?如果是这样,你在global.asax.cs有这个吗?顾名思义,它用MVC注册了这些区域。

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 
    } 
+0

我确实有这个,我有地区注册类,但问题依然存在。问题是,我们的视图引擎会重置文件夹的某些路径,以允许在各自文件夹中的视图和共享文件夹之间进行链接,如您所见。 – mare 2010-05-06 19:21:14

+0

编写附加视图引擎时,这些区域不相关。 http://aspnet.codeplex.com/sourcecontrol/network/Show?projectName=aspnet&changeSetId=23011#266536是默认的WebFormViewEngine,并且它没有关于区域的代码。这就是我认为它可能与配置有关的原因。 – Jab 2010-05-06 19:49:07

+0

感谢您的建议,但它必须是视图引擎问题,因为如果我从global.asax.cs注释掉它,它会发现区域视图没有问题。 – mare 2010-05-06 20:08:26

2

...搜索那些4个标准文件夹,但它并没有下区

这实际上是一个提示一下 - MVC不知道在哪里以及如何寻找,因为位置的地区查看尚未在您的自定义视图引擎中定义。

您可能需要设置AreaPartialViewLocationFormats并在ViewLocationFomats属性中包含Areas位置,因为这是一个已启用区域的应用程序。

ViewLocationFormats = new[] 
{ 
    "~/Areas/Views/{1}/{0}.aspx", 
    ... 
}; 

,并可能......

AreaPartialViewLocationFormats = new[] 
{ 
    "~/Areas/{1}/Views/{0}.ascx", 
    "~/Areas/Views/{1}/{0}.ascx", 
    "~/Views/Shared/{0}.ascx" 
}; 

两个引用:

  1. MSDN < - 大概是因为更新MVC1 包括新的领域 的东西,因此为什么它不工作
  2. The Haack < - 旧视图引擎在Global.asax需要修改的文章,但一个很好的介绍和概述
3

不是你的问题的直接回应,但一些其他的读者可能会发现有用,使用自定义:

void Application_Start(object sender, EventArgs e) 
{ 
    RegisterRoutes(RouteTable.Routes); 
    ViewEngines.Engines.Clear(); 
    ViewEngines.Engines.Add(new PendingViewEngine()); 
} 
  • 马特
相关问题