Объедините ASP.Net MVC с веб-формами

Можно ли создать корневое приложение MVC (портал с мастер-страницами и темами) и добавить пару подпроектов на основе WebForms (у нас уже есть приложение WebForms, которое мы хотели бы интегрировать в портал)?

Как бы вы централизовали навигацию (карты сайта, маршрутизация URL)?
Как бы вы поделились шедеврами?
Как бы вы ссылались на ресурсы (~ вопросы и т. Д.)?

Решения, подобные описанному здесь, выглядят несколько устаревшими

4 ответа

Решение

Объединение веб-форм с MVC вполне возможно. См. Это сообщение в блоге Скотта Хансельмана для введения.

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

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

  1. Создайте новое приложение ASP.NET MVC 4 и выберите пустой шаблон (с помощью Razor).

  2. После загрузки щелкните правой кнопкой мыши на References > Browse и затем перейдите в папку Bin моего существующего веб-сайта. Затем я добавил в DLL, которые я использовал на существующем сайте. Для справки, я использую AjaxControlToolkit, поэтому решил добавить последнюю версию NuGet. Это должно затем автоматически обновить файл web.config

  3. Затем я открыл Windows Explorer и перешел в корневую папку моего существующего сайта. Используя Visual Studio, я затем реплицировал структуру папок верхнего уровня существующего сайта (за исключением папки Bin), в результате чего 2 сайта имели одинаковые папки верхнего уровня (но новый проект имел MVC App_Start, Controllers, Models and Views). папки тоже, но не бин, очевидно).

  4. После установки я скопировал подпапки и файлы из соответствующей папки верхнего уровня в проводнике Windows и вставил их в решение. Если вы делаете это так, проект позволяет вам копировать в подпапки и контент напрямую, добавляя существующий элемент через Visual Studio, копируя только файлы, что экономит время. Обратите внимание: для корневой папки я НЕ копировал в web.config или Global.asax, но копировал во все другие файлы (например, default.aspx и т. Д.)

  5. После того, как все содержимое было скопировано, я открыл web.config в новом проекте и web.config на существующем сайте. Я скопировал в новый файл web.config что-то конкретное для существующего сайта (appSettings, connectionStrings, пространства имен, информация о членстве и т. Д.). То же самое относится и к файлам Global.asax.

  6. Я попытался построить и исправить все, что я пропустил.

  7. Как только все было правильно (и я сбил несколько желтых экранов смерти), я заметил, что при загрузке 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 минут, и я начал работать... хорошо сидел и кодировал:)

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

Я был слишком застрял в этой ситуации, в конце концов я получил решение, которое сработало, в первую очередь скопировать web.config в папке ваших просмотров.

После этого откройте Route.config(Routeconfig) файл, там вы найдете один метод RegisterRoutesсохраните его как есть и создайте другой метод с именем RegisterRoutes2()и скопируйте и вставьте приведенный ниже код метода из приложения mvc:

public static void RegisterRoutes2(RouteCollection routes)
{...}

в некоторых случаях имя метода в приложении MVC будет RegisterRoutes. Если приведенный выше код не работает, скопируйте и вставьте его из приложения mvc на своем компьютере. Затем перейдите к global.asax файл, там вы найдете RegisterRoutes() был назван, просто сейчас, также позвоните RegisterRoutes2(), И все готово, перезапустите приложение или очистите сборку, оно запустится.

Другие вопросы по тегам