Объединение ASP.Net MVC с WebForms
Можно ли создать корневое приложение MVC (Portal с мастер-страницами и темами) и добавить несколько подпроектов на основе WebForms (у нас уже есть существующее приложение WebForms, которое мы хотели бы интегрировать в Portal)?
Как бы вы централизовали навигацию (sitemaps, маршрутизация URL)?
Как вы разделите мастер-страницы?
Как бы вы ссылались на ресурсы (~ вопросы и т.д.)?
Решения, подобные описанному здесь выглядят несколько устаревшими
Ответы
Ответ 1
Совмещение веб-форм с MVC вполне возможно. См. этот пост в блоге Скотта Гензельмана для ознакомления.
Ответ 2
Для справки мне удалось выполнить эту задачу вчера - добавьте функциональность MVC на существующий веб-сайт WebForms, то есть - так думал, что я напишу, если он будет кому-то полезен.
Люди говорят: "лучший способ - переписать приложение для ваших веб-форм как MVC", но часто бывает, что это не так, когда приложение хорошо установлено и со временем становится очень монстром (это все еще хорошо работает Могу добавить). В моем случае нас попросили внедрить новую функцию в это приложение - и в последнее время она разрабатывалась в MVC для других проектов - я хотел создать эту новую функцию в MVC. Это то, что я сделал:
-
Создайте новое приложение ASP.NET MVC 4 и выберите Пустой шаблон (с помощью Razor)
-
После загрузки щелкните правой кнопкой мыши Ссылки > Обзор, а затем перейдите в папку Bin моего существующего веб-сайта. Затем я добавил в DLL, которую я использовал на существующем сайте. Для справки, я использую AjaxControlToolkit, поэтому решил добавить последний из NuGet. Затем это должно автоматически обновить файл web.config.
-
Затем я открыл проводник Windows и перешел в корневую папку моего существующего веб-сайта. Используя Visual Studio, я затем реплицировал структуру структуры верхнего уровня существующего сайта (минус папка Bin), в результате чего на двух сайтах были одинаковые папки верхнего уровня (но новый проект с MVC App_Start, Controllers, Models и Views также, но не Bin).
-
После настройки я скопировал подпапки и файлы из соответствующей папки верхнего уровня в Проводнике Windows и вставил их в решение. Если вы это сделаете, проект позволяет копировать в подпапки и содержимое напрямую, добавляя существующий элемент через визуальную студию только копии файлов, тем самым экономя время. Обратите внимание: для корневой папки я сделал НЕ копию в web.config или Global.asax, но скопировал все остальные файлы (например, default.aspx и т.д.)
-
Как только весь контент был скопирован, я открыл web.config в новом проекте и web.config на существующем сайте. Я скопировал в новый web.config что-то конкретное для существующего сайта (appSettings, connectionStrings, пространства имен, информация о членстве и т.д.). То же самое применяется к файлам Global.asax.
-
Я попытался построить и исправил все, что я пропустил.
-
Как только все было правильно (и я сбил несколько желтых экранов смерти), я заметил, что при загрузке default.aspx я обнаружил ошибку страницы. Это касается маршрутизации, вот изменения, которые я внес в информацию маршрутизации (расположенную в Global.ascx MVC 3 или App_Start > RouteConfig.cs MVC 4):
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// This informs MVC Routing Engine to send any requests for .aspx page to the WebForms engine
routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");
routes.IgnoreRoute("{resource}.aspx");
// Important change here: removed 'controller = "Home"' from defaults. This is the key for loading
// root default page. With default setting removed '/' is NOT matched, so default.aspx will load instead
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { action = "Index", id = UrlParameter.Optional }
);
}
При выполнении всех этих шагов сайт загружался и запускался, как всегда, но теперь у меня есть ASP.NET WebForms и MVC-гибрид. Я уверен, что, возможно, есть более простые способы решения этой задачи, но я попробовал другие методы и не смог. Этот путь занял у меня около 20 минут, и я начал работать... хорошо сидел и кодировал:)
Ответ 3
Отличный ответ выше. Другая вещь, которую вы могли бы рассмотреть, - это переход с ASP.NET на ASP.NET MVC, и в этом случае
Ответ 4
Я был слишком застрял в этой ситуации, ведь я получил решение, которое сработало, прежде всего скопировав web.config
в вашу папку представлений.
После этого открытого файла Route.config(Routeconfig)
вы найдете один метод RegisterRoutes
, сохраните его как есть и создайте еще один метод с именем RegisterRoutes2()
и скопируйте в него следующий код метода из приложения mvc:
public static void RegisterRoutes2(RouteCollection routes)
{...}
в некоторых случаях имя метода в приложении mvc будет RegisterRoutes.
Если выше код не работает, скопируйте его из приложения mvc в машины.
Затем перейдите в global.asax
файл, и вы найдете RegisterRoutes()
, который теперь называется простым, также вызывайте RegisterRoutes2()
.
И вы закончили, перезапустите приложение или очистите его, он будет запущен.