Объедините ASP.Net MVC с веб-формами - PullRequest
41 голосов
/ 05 февраля 2010

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

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

Ответы [ 4 ]

42 голосов
/ 05 февраля 2010

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

21 голосов
/ 01 мая 2014

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

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

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

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

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

  4. После установки я скопировал подпапки и файлы из соответствующей папки верхнего уровня в Windows Explorer и вставил их в решение. Если вы делаете это так, проект позволяет вам копировать в подпапки и контент напрямую, добавляя существующий элемент через 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 минут, и я начал работать ... хорошо сидел и кодировал:)

5 голосов
/ 05 февраля 2010

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

0 голосов
/ 21 декабря 2016

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

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

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

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

...