Как сделать один сайт ASP.NET MVC "полученным" из другого

Мой вопрос похож на "проекты ASP.NET 2 для совместного использования одинаковых файлов" , но с наклонением ASP.NET MVC.

В принципе, у нас есть два сайта, один из которых основан в основном на другом (примерно 90% просмотров, контроллеры, изображения, во втором идентичны первому). Однако в некоторых случаях представления могут быть разными или контроллер на втором сайте может отличаться от первого.

Есть ли какие-либо простые способы достижения этого в ASP.NET MVC?

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

Одна из проблем с этим подходом заключается в том, что большинство страниц во втором проекте буквально не существуют в виртуальном каталоге, это делает отладку болью - вы должны публиковать, чтобы генерировать файлы, чтобы вы могли отлаживать.

Есть ли у кого-нибудь лучшие подходы или способы упрощения этого подхода?

Ответы

Ответ 2

Если они 90% одинаковы, и вы хотите, чтобы они синхронизировались по мере развития функциональности, я бы подумал о том, чтобы сделать их в одном веб-приложении и использовать заголовок хоста для дифференциации и изменения изображений/ссылки/текст/функциональность/и т.д.. между двумя сайтами.

Вы можете сделать это в своем BaseController: посмотрите на заголовок узла и создайте объект Brand, к которому имеют доступ каждая страница и представление, так же как и объект User. Этот объект Brand может включать имя сайта, канонический Url для сайта, расположение каталога изображений для этого бренда, логические значения для включения или отключения определенных функций,...

Теперь в контроллере вы можете просто попросить if (Brand.SupportsPageX) {...} решить, что показывать дальше. И если вы сделаете объект бренда частью своей базовой модели представления или поместили его в коллекцию представлений, вы можете иметь представления, в которых используется название бренда, каталог изображений... для настройки того, как они выглядят.

Ответ 3

  • Поместите как можно больше в общий проект библиотеки, отличной от UI. Я делаю это в каждом проекте, над которым я работаю над этим, повышает тестовую совместимость, общий код с помощью служб Windows и множество других причин.

    Я обнаружил, что если вы агрессивны с этим, то нередко более двух третей проекта будет в общей библиотеке, отличной от UI.

    После этого вы можете сделать еще один шаг и создать вторую библиотеку с несколькими элементами MVC/UI.

  • В зависимости от вашего мнения об этом, RenderAction может немного помочь здесь. Как вы знаете, RenderAction позволит вам группировать эти компоненты контроллера/просмотра и передавать переменные аргументы во время выполнения.

Ответ 4

Проект, над которым я работаю, в настоящее время имеет аналогичное требование, и мы начали смотреть на переносные области. Я лично не очень глубоко погрузился в них, но, возможно, стоит посмотреть.

Ответ 5

Я работал с областями для создания нескольких веб-сайтов, которые я могу разместить с одной учетной записью хостинга. Я бы подумал, что вы можете использовать подобный подход. Используя общие функциональные возможности базового проекта, он будет доступен для каждой области. Вы также можете переопределить любой из базовых представлений или контроллеров, выполнив их в области. Это может потребовать некоторой настройки ViewEngine и Routing, но я думаю, что это можно сделать.