Это мое пошаговое руководство, основанное на шагах, которые мы предприняли в моей компании при переходе от классической веб-формы ASP.Net к ASP.Net MVC. Это не идеально, и все еще продолжается, так как мы должны делать это поэтапно из-за размера сайта, но, возможно, кто-то еще найдет и отправит улучшенный ответ на основе наших результатов.
Этапы:
1. Планирование - переход на MVC из веб-форм в ASP.Net требует тщательного планирования. Ошибка, которую мы сделали в нашем движении, заключается в том, что мы не осознаем, что на этом этапе планирования есть два аспекта: планирование маршрута и планирование модели / контроллера / действия.
Невыполнение этого требования приведет к серьезным проблемам позже, когда вы попытаетесь расширить функциональность вашего сайта или столкнетесь с более сложными миграциями.
Советы:
- Посмотрите на свою текущую карту сайта и спроектируйте улучшенную структуру сайта / структуру каталогов, которая будет использоваться в приложении ASP.Net MVC. Определите «язык» для вашего сайта, например, поведение ASP.Net MVC по умолчанию - поведение http://sitename/{controller}/{action}/{id}, но вы можете переопределить его, получив больше опыта взлома правил маршрутизации.
Помните, что по умолчанию каждый контроллер будет перенаправлен через виртуальный подкаталог вашего приложения, например, http://sitename/X будет направлять в XController (и по умолчанию его метод Index), http://sitename/Y/Get будет направлять в метод Get () YController. Вы можете изменить это по своему усмотрению (маршрутизация действительно мощная), но это выходит за рамки этого ответа.
Используя существующую карту сайта, укажите, в какую папку в структуре MVC должна упасть каждая текущая страница .aspx (конечно, сначала спросите, должна ли она вообще существовать).
Если сценарии, изображения и т. Д. Не хранятся вместе или в каких-то папках с «зарезервированными именами» в каждом подкаталоге, подумайте об этом сейчас, когда вы будете перепроектировать.
Это значительно упростит ваш дизайн, позволив вам использовать команду правила маршрутизации Map.IgnoreRoute () в файле Global.aspx.cs для обхода обработки этих папок как маршрутов.
В нашем случае мы отразили реальный макет подкаталога текущего сайта, где каждый подкаталог стал контроллером, например / У учетной записи будет AccountController, у / X будет XController. Все страницы, которые попали внутрь, были заменены действиями внутри каждого контроллера. например http://sitename/profile/about.aspx теперь стал http://sitename/profile/about и сопоставлен с методом about about ActionResult внутри profileController.
Это позволяет нам оставаться гибкими, выполняя частичную миграцию одного или двух каталогов (или нескольких файлов в одном каталоге) за серию спринтов, вместо того, чтобы выполнять миграцию всего сайта за один раз в течение гораздо более длительного периода времени.
Создайте новое приложение ASP.Net MVC в Visual Studio и немедленно создайте правила в файле Global.asax, которые игнорируют правила маршрутизации для папок, существующих на текущем сайте.
Скопируйте папки из веб-приложения ASP.Net в папки приложения ASP.Net MVC. Запустите веб-сайт и убедитесь, что он работает правильно (так как правила маршрутизации еще не используются).
Выберите подкаталог или подмножество файлов в подкаталоге для миграции.
Для каждой страницы .aspx внутри этого подкаталога:
а. Сначала создайте его вид. Я склонен использовать версию страницы, отображаемую в веб-браузере, в качестве базового HTML, а затем помещать заполнители в места, которые, как мне известно, заполнены динамическими данными.
б. Используя заполнители для динамических данных, создайте первый черновик Модели, используя простые типы данных. Эта модель вначале будет простой, но будет постоянно подвергаться рефакторингу при переносе большего количества страниц с исходного сайта, поэтому не беспокойтесь, если она начнет выглядеть немного тяжелой. Если вы обнаружите, что у вас слишком много свойств в одной модели на ваш вкус, или вы видите логическую группировку, выходящую за рамки только модели определенного подмножества элементов, возможно, это признак того, что модель должна подвергаться рефакторингу, чтобы иметь объект вместо этих простых данных Типы как свойства, но составлены на уровне бизнес-логики.
с. Создайте контроллер, если он еще не был создан, и поместите соответствующий метод ActionResult для действия, которое, как вы определили, запланировано для вашего маршрута.
Если вы понимаете, что существует новое действие, которое не отображается на странице со старого сайта, то создайте представление для контроллера и включите соответствующие теги // TODO:, чтобы вы могли отслеживать это для реализации после того, как вы перенесли существующие страницы.
д. Также попробуйте добавить некоторый код обработки для неизвестных действий, если у вас нет правила маршрутизации {* catchall} для этого уже в вашем файле global.asax.cs.
е. Создайте классы конструктора для Модели, чтобы при определенных параметрах, которые будет иметь Контроллер (передаваемый как ваш {id} или, возможно, параметр Request.QueryString из URL-адреса, или заголовок HTTP или файл cookie), Модель будет знать, как обратиться к существующим классам бизнес-логики и создать себя для рендеринга с помощью View.
е. Перейдите на следующую страницу в списке и начните снова с шага a.
Наконец, создайте правило маршрутизации, которое будет вызывать ваш новый контроллер и разрешать выполнение написанных вами действий. Отладка, отладка, отладка ... Как только все будет хорошо, удалите существующую папку и файлы, которые вы перенесли с основного сайта, а также правило IgnoreRoute в global.asax.cs.
Создайте редирект любым способом, который вы предпочитаете, если вы хотите сохранить старые имена каталогов и файлов для непрерывности (например, пользователи, возможно, уже добавили в закладки определенные страницы на старом сайте).
Примечание. Если вы сохраняете точные имена старых подкаталогов на своем сайте MVC на этапе портирования, предпочтительно перенести целый подкаталог за один раз, как я понял, потому что, выполняя только несколько файлов, правила маршрутизации вам нужно сделать запись более сложной, поскольку если существует существующая папка с тем же именем, что и путь правила маршрутизации, и в этой папке есть файл Default.aspx, то (/ foldername /) по умолчанию будет использоваться страница Default.aspx, поскольку она требует точности по правилам маршрутизации.
Совет: Серьезно подумайте об использовании такого инструмента, как RouteDebug , для отладки маршрута, чтобы вы могли выяснить странные вещи, подобные описанным выше, или если у вас несколько правил маршрутизации, запускающих и вызывающих неожиданное поведение.
Это мой первый черновик, пожалуйста, дайте мне обратную связь, если я пропустил какие-либо шаги или если вы видите какие-либо пробелы в руководстве, и я соответствующим образом изменю ответ.