Организация представлений MVC2 с помощью подкаталога - PullRequest
1 голос
/ 14 июня 2011

У нас довольно большой проект MVC с большим количеством представлений и частичных представлений (шаблоны отображения / редактирования). Почти 95% нашего пользовательского интерфейса находится в наших шаблонах, наши aspx представления - это просто заполнители, которые вызывают наши ascx шаблоны. Таким образом, всякий раз, когда мы открываем эту папку Views в VS2010, довольно сложно прокручивать вниз папку Shared, чтобы мы могли управлять нашими шаблонами.

Мы хотели бы немного изменить эту иерархию. Вместо того, чтобы иметь папку для каждого контроллера под Views, вместо этого мы хотели бы иметь папку с именем Pages под Views и иметь наши папки для каждого контроллера здесь. Таким образом, когда мы открываем Views, у нас есть 2 папки: Pages и Shared.

Возможно ли это легко, не возвращаясь и не редактируя каждый из наших контроллеров, где они просто return View(); до return View("Pages/MyControllerName/MyActionHandler");? Я бы хотел, чтобы контроллеры по-прежнему просто return View(); и не меняли свои URL. Другими словами, я просто хочу переместить мой корневой каталог для моих просмотров в Views / Pages, но не для шаблонов - они остаются такими, как есть.


Решение, с которым мы пошли:

global.asax.cs: (добавьте их как первые 2 строки Application_Start() - больше ничего не меняйте)

        var locations = ((WebFormViewEngine)ViewEngines.Engines.First()).ViewLocationFormats.ToList().Select(x => x.ToLower().Replace("views/{", "Views/Pages/{"));

        ((WebFormViewEngine) ViewEngines.Engines.First()).ViewLocationFormats = locations.ToArray();

Это позволяет нашей папке Views иметь 3 вещи:

  1. Страницы
  2. Общий
  3. web.config

Так как мы выполняем 95% нашего пользовательского интерфейса в пределах наших Shared DisplayTemplates и EditorTemplates, это исключает возможность того, что в основном мы все время игнорируем, будучи разработчиками. В то время как предлагаемый ответ состоял в том, чтобы сделать ViewEngines.Engines.Clear(); и затем добавить вновь созданный экземпляр, у нас были проблемы с MVC, играющим хорошо с новым. Поэтому мы решили изменить функциональный и уже созданный экземпляр. Мне не нравится кастинг, и мы добавим немного кода, чтобы он был лучше, но это функциональный код, который поможет любому, кто тоже хочет это сделать.

1 Ответ

2 голосов
/ 14 июня 2011

Вам необходимо зарегистрировать ViewEngine со свойством ViewLocationFormats, в которое будут включены ваши новые местоположения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...