Как сделать один сайт ASP.NET MVC "полученным" из другого
Мой вопрос похож на "проекты ASP.NET 2 для совместного использования одинаковых файлов" , но с наклонением ASP.NET MVC.
В принципе, у нас есть два сайта, один из которых основан в основном на другом (примерно 90% просмотров, контроллеры, изображения, во втором идентичны первому). Однако в некоторых случаях представления могут быть разными или контроллер на втором сайте может отличаться от первого.
Есть ли какие-либо простые способы достижения этого в ASP.NET MVC?
До сих пор мы рассматривали использование связанных файлов, чтобы иметь два совершенно разных проекта, в которых второй проект использует файлы, которые ему нужны, с первого.
Одна из проблем с этим подходом заключается в том, что большинство страниц во втором проекте буквально не существуют в виртуальном каталоге, это делает отладку болью - вы должны публиковать, чтобы генерировать файлы, чтобы вы могли отлаживать.
Есть ли у кого-нибудь лучшие подходы или способы упрощения этого подхода?
Ответы
Ответ 1
Эта статья может помочь: http://dotnetslackers.com/articles/aspnet/storing-asp-net-mvc-controllers-views-in-separate-assemblies.aspx
По сути, это связано с созданием собственного WebFormViewEngine, который сообщает MVC, где искать представления.
Ответ 2
Если они 90% одинаковы, и вы хотите, чтобы они синхронизировались по мере развития функциональности, я бы подумал о том, чтобы сделать их в одном веб-приложении и использовать заголовок хоста для дифференциации и изменения изображений/ссылки/текст/функциональность/и т.д.. между двумя сайтами.
Вы можете сделать это в своем BaseController: посмотрите на заголовок узла и создайте объект Brand
, к которому имеют доступ каждая страница и представление, так же как и объект User
. Этот объект Brand
может включать имя сайта, канонический Url для сайта, расположение каталога изображений для этого бренда, логические значения для включения или отключения определенных функций,...
Теперь в контроллере вы можете просто попросить if (Brand.SupportsPageX) {...}
решить, что показывать дальше. И если вы сделаете объект бренда частью своей базовой модели представления или поместили его в коллекцию представлений, вы можете иметь представления, в которых используется название бренда, каталог изображений... для настройки того, как они выглядят.
Ответ 3
-
Поместите как можно больше в общий проект библиотеки, отличной от UI. Я делаю это в каждом проекте, над которым я работаю над этим, повышает тестовую совместимость, общий код с помощью служб Windows и множество других причин.
Я обнаружил, что если вы агрессивны с этим, то нередко более двух третей проекта будет в общей библиотеке, отличной от UI.
После этого вы можете сделать еще один шаг и создать вторую библиотеку с несколькими элементами MVC/UI.
-
В зависимости от вашего мнения об этом, RenderAction может немного помочь здесь. Как вы знаете, RenderAction позволит вам группировать эти компоненты контроллера/просмотра и передавать переменные аргументы во время выполнения.
Ответ 4
Проект, над которым я работаю, в настоящее время имеет аналогичное требование, и мы начали смотреть на переносные области. Я лично не очень глубоко погрузился в них, но, возможно, стоит посмотреть.
Ответ 5
Я работал с областями для создания нескольких веб-сайтов, которые я могу разместить с одной учетной записью хостинга. Я бы подумал, что вы можете использовать подобный подход. Используя общие функциональные возможности базового проекта, он будет доступен для каждой области. Вы также можете переопределить любой из базовых представлений или контроллеров, выполнив их в области. Это может потребовать некоторой настройки ViewEngine и Routing, но я думаю, что это можно сделать.