У нас довольно большой проект 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 вещи:
- Страницы
- Общий
- web.config
Так как мы выполняем 95% нашего пользовательского интерфейса в пределах наших Shared
DisplayTemplates
и EditorTemplates
, это исключает возможность того, что в основном мы все время игнорируем, будучи разработчиками. В то время как предлагаемый ответ состоял в том, чтобы сделать ViewEngines.Engines.Clear();
и затем добавить вновь созданный экземпляр, у нас были проблемы с MVC, играющим хорошо с новым. Поэтому мы решили изменить функциональный и уже созданный экземпляр. Мне не нравится кастинг, и мы добавим немного кода, чтобы он был лучше, но это функциональный код, который поможет любому, кто тоже хочет это сделать.