Объединение ASP.Net MVC с WebForms

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

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

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

Ответ 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(). И вы закончили, перезапустите приложение или очистите его, он будет запущен.