Custom View Engine в ASP.NET MVC 2 не работает с областями

До сих пор я использовал приведенный ниже код с ASP.NET MVC v1 и v2, но когда я сегодня добавил область в свое приложение, контроллер этой области не смог найти никаких представлений в моей папке Areas / Views / controllerView. Он выдал очень известное исключение, что он просматривал эти 4 стандартные папки, но не просматривал области ..

Как я могу изменить код, чтобы он работал с Областями? Может быть, пример настраиваемого механизма просмотра под ASP.NET MVC 2 с поддержкой областей? Информации об этом в сети очень мало.

Вот код:

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

person mare    schedule 06.05.2010    source источник


Ответы (3)


Это не прямой ответ на ваш вопрос, но кое-что, что другие читатели могут найти полезным, чтобы использовать настраиваемый механизм просмотра, необходимо изменить global.asax:

 void Application_Start(object sender, EventArgs e)
 {
  RegisterRoutes(RouteTable.Routes);
  ViewEngines.Engines.Clear();
  ViewEngines.Engines.Add(new PendingViewEngine());
 } 
  • Мэтт
person MJBarlow    schedule 04.10.2010

... поискал в этих 4 стандартных папках, но не в областях

На самом деле это подсказка - MVC не знает, где и как искать представления области, поскольку расположение не было определено в вашем пользовательском механизме представления.

Возможно, вам потребуется настроить AreaPartialViewLocationFormats и включить Areas Location в свойство 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 ‹- старый пост, но хорошее введение и обзор
person Ahmad    schedule 07.05.2010

Когда вы создавали Area, создавался ли класс AreaRegistration? Если да, то есть ли это у вас в global.asax.cs? Как следует из названия, он регистрирует области с помощью MVC.

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
    }
person Jab    schedule 06.05.2010
comment
У меня есть это, и у меня есть класс регистрации области, но проблема остается. Проблема в том, что мой механизм просмотра сбрасывает некоторые пути к папкам, чтобы разрешить связь между представлениями в соответствующих папках и общей папкой, как вы можете видеть. - person mare; 06.05.2010
comment
Эти области не имеют отношения к кодированию дополнительного механизма просмотра. aspnet.codeplex.com/sourcecontrol/network/ - это WebFormViewEngine по умолчанию, и в нем нет кода для областей. По этой причине я предположил, что это может быть связано с конфигурацией. - person Jab; 06.05.2010
comment
Спасибо за ваши предложения, но это, должно быть, проблема механизма просмотра, потому что, если я закомментирую ее из global.asax.cs, он без проблем найдет виды области. - person mare; 07.05.2010
comment
Можете попробовать сменить return new WebFormView(partialPath, ""); на return new WebFormView(partialPath, null);? - person Jab; 07.05.2010