ASP.NET MVC 2中的自定义视图引擎不适用于区域

时间:2010-05-06 19:01:37

标签: asp.net-mvc viewengine

到目前为止,我使用了ASP.NET MVC v1和v2下面的代码,但是当我今天在我的应用程序中添加了一个区域时,该区域的控制器在我的Areas / Views / controllerView文件夹中找不到任何视图。它发出了一个众所周知的例外,它搜索了这4个标准文件夹,但它没有看到区域..

如何更改代码以便它可以与区域一起使用?也许是ASP.NET MVC 2下支持Areas的自定义视图引擎的一个例子?网上的信息很简陋......

以下是代码:

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);
    }
}

3 个答案:

答案 0 :(得分:3)

不是对您的问题的直接回复,而是其他读者可能认为有用的东西,要使用自定义视图,需要修改global.asax:

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

答案 1 :(得分:2)

...搜索了这4个标准文件夹,但它没有查看区域

这实际上是一个提示 - 由于尚未在自定义视图引擎中定义位置,因此MVC不知道在何处以及如何查找区域视图。

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

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< - 旧帖子,但很好的介绍和概述

答案 2 :(得分:0)

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

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