Как бы вы посыпали ASP.Net MVC в существующий проект веб-сайта?

В Visual Studio 2008 с пакетом обновления 1 (SP1) у меня есть проект ASP.NET Webforms (haha) для веб-сайтов ASP.NET , что я хотел бы постепенно внедрить некоторые функции MVC.

Большая часть информации, которую я могу найти о том, как интегрировать ASP.Net MVC с WebForms, кажется, предполагает использование проекта веб-приложений. Однако представляется невозможным найти информацию о том, как модифицировать существующий проект веб-сайта ASP.net с помощью функций ASP.Net MVC.

Я рассмотрел сообщение Скотта Ханзельмана и Глава 13 его будущей книги, оба из которых предполагают тип проекта веб-приложения.

Возможно ли это? Кто-нибудь имеет право на это?

Ответ 1

Хорошо для стартеров, добавляющих MVC в проект webforms, довольно просто, чтобы получить функции в VS 2008 для MVC, требуется немного больше работы (все еще легко). Сначала вы хотите убедиться, что вы ссылаетесь на сборки и используете .Net 3.5. Во-вторых, вы можете создать папку контроллеров и просмотреть папку в своем текущем проекте веб-форм. Вы также можете создать простой контроллер с действием индекса. Затем настройте/настройте маршруты в файле global.ascx. Вы должны быть установлены оттуда. Отметьте здесь для справки.

Однако вы сможете создавать aspx-страницы с записями кода (вы можете удалить их и ввести правильный класс наследования в разметке). Чтобы фактически "преобразовать" свой тип проекта, чтобы вы получили доброту MVC и визуальной студии (добавить новый просмотр, goto-контроллер и т.д.), Нужно немного поиграть. Мой лучший совет - создать новый проект MVC в VS 2008 и новый проект веб-приложения и сравнить файлы .csproj в виде простого текста. Существует длинное строковое значение, которое указывает VS шаблон проекта.

Поверьте, это работает. Я делал это раньше в своих собственных проектах. Я не помню, как я нашел тип проекта "ключ" помимо проб/ошибок/устранения. ASP.Net MVC отлично работает в том же проекте, что и веб-формы.

UPDATE: Я думаю, вы можете перейти к типу проекта MVC, который по-прежнему является веб-приложением, используя их в PropertyGroup файла .csproj. Сравните их с тем, что у вас есть, и измените те, которые отличаются, обязательно скопируйте/создайте резервную копию файла.

<ProjectGuid>{B99EC98A-1F09-4245-B00D-5AF985190AA9}</ProjectGuid>
<ProjectTypeGuids>{603c0e0b-db56-11dc-be95-000d561079b0};{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>

Обновление 2:. Вы не повлияли бы на проект и не повлияли бы на него. Если вам нелегко сделать резервную копию и поиграть. Если вы столкнетесь с изменениями, у вас всегда будет резервная копия. Сначала я был настроен скептически, но был рад, что пошел по пути MVC.

Ответ 2

Я думал, что дам обновленный ответ, используя Visual Studio 2010 SP1/NuGet/Scott Hanselman полностью неподдерживаемую утилиту.

  • Установить MVC3 (w/nuget) http://www.asp.net/mvc/mvc3
  • Перейдите в меню "Инструменты" в Visual Studio и выберите "Диспетчер пакетов библиотек" \ "Консоль диспетчера пакетов".
  • Когда появится окно консоли, измените проект "Проект по умолчанию" на ваш проект веб-форм.
  • Введите "Install-Package AddMvc3ToWebForms" (http://nuget.org/List/Packages/AddMvc3ToWebForms)

Это добавит все необходимые DLL, файлы javascript, изменения настроек web.config и т.д. в проект. Если все было успешным, вы должны нажать F5, перейти к "home" на своем веб-сайте и посмотреть образец формы, представленный mvc: "Добро пожаловать в ASP.NET MVC, полностью обновленный пакетом NuGet полностью без поддержки Hanselman! Нет гарантии!".

Ответ 3

Для проекта WebSite вам просто нужно добавить контроллеры в App_Code, а не в корневой каталог. Вы пропустите некоторую добротность VS - поскольку он не знает, что вы используете MVC без файла csproj, но вы действительно получите его работу.

Просто помните, чтобы наследовать от Controller и ViewPage, и вы должны быть хорошими.

Ответ 4

У меня был довольно большой веб-сайт ASP.NET(а не веб-приложение) и я хотел добавить к нему MVC3. У меня не было возможности изменить тип проекта, поэтому мне пришлось пойти с веб-сайтом (asp.net 4.0).

Я использую отдельный проект MVC, но не как собственный веб-приложение, а как сборку на своем старом веб-сайте.

Вот краткое изложение того, что я сделал:

  • Я создал новое веб-приложение MVC3 в Visual Studio 2010, я использовал пустой шаблон и механизм просмотра Razor.
  • Я добавил его к решению с помощью моего существующего веб-сайта.
  • Я изменил выходной путь для сборки из локального bin каталог в каталог bin моего веб-сайта.
  • Я удалил папки "Содержимое" и "Сценарии" из приложения MVC. И то и другое контент и скрипты уже являются частью моего веб-сайта, и я могу ссылайтесь на них также на страницы MVC.
  • Я удалил файлы Global.asax. * из проекта. Я использую Global.asax на веб-сайте.
  • Я скопировал папку "Представления" и подпапки на веб-сайт. Потому что это фактические файлы, а не часть сборки, они должны существовать на веб-сайте а не проект, который создает сборку MVC.
  • В этот момент я мог удалить папку "Представления" из проекта MVC, но только в этом типе проекта я получаю поддержку Visual Studio для добавления нового представления. Поэтому я иногда создаю представление здесь, а затем переношу его на веб-сайт. При редактировании файлов cshtml на моем веб-сайте я все равно получаю полный Intellisense.
  • Добавлена ​​маршрутизация на веб-сайт. Я просто скопировал некоторый код из MVC global.asax в global.asax моего веб-сайта. Нам нужны некоторые операции:

    using System.Web.Mvc;
    using System.Web.Routing;
    

В Application_Start нам нужно:

    AreaRegistration.RegisterAllAreas();
    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);

Затем добавьте обычные методы маршрутизации:

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        // your routes
    }

Затем добавьте несколько вещей в web.config вашего веб-сайта. В system.web при компиляции нам нужны следующие сборки:

     <assemblies>
        <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      </assemblies>

Изначально я также добавил некоторое пространство имен MVC в web.config, но, похоже, он отлично работает без них.

Теперь вы создаете новые маршруты в Global.asax веб-сайта, затем добавляете соответствующий контроллер в проект MVC, а затем возвращаетесь на веб-сайт, чтобы добавить для него представление. Итак, вы все логично в сборке, в то время как представления и маршрутизация определены на веб-сайте.

Вы все еще можете отлаживать контроллеры MVC, устанавливая там точки останова, но вы отлаживаете, запустив веб-сайт.

Если вы используете предложенный маршрут по умолчанию MVC:

        routes.MapRoute("Default", "{controller}/{action}/{id}", 
            new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

вызов на www.mysite.com будет обслуживать содержимое домашнего контроллера/просмотра, а не ваш старый  default.aspx, поэтому я просто не использую такой маршрут. Если вы перенаправляете конфликт с существующими физическими папками и файлами, используйте ограничения с регулярными выражениями маршрутов, чтобы исключить такие конфликты.

Несмотря на то, что я использую мастер-страницы на веб-сайте, фактический html для общих частей страницы создается кодом в другой сборке. Я мог бы просто вызвать те же методы из моего _ViewStart.cshtml или моего базового контроллера.

До сих пор я не видел никаких реальных негативных последствий такого подхода.

Ответ 5

Пока вы настраиваете маршрутизацию в web.config, настраиваете необходимую структуру каталогов и добавляете правильные маршруты в global.asax, теоретически можете добавлять элементы MVC в любой веб-проект. Насколько я знаю, это единственные требования для его работы.

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

Ответ 6

Если вы хотите добавить MVC 3 на веб-сайт asp.net, а не в веб-проект, то пакет Scott Hanselman AddMvc3ToWebForms nuget доставит вам 99% пути туда, но будет вызывать ошибку во время установки, которую вы можете игнорировать (я думаю, по крайней мере, в моих тестах это похоже на случай), и после установки потребуется несколько простых шагов.

Подробная информация о http://delradiesdev.blogspot.com/2011/08/adding-mvc-3-to-aspnet-web-site.html

Mark (@delradie)

Ответ 7

Что-то, что я узнаю при попытке перенести приложение MVC2, заключается в том, что вашему проекту нужен Default.aspx. Мне было поручено добавить некоторые GUI-функции в существующий проект веб-служб, и поэтому не было default.aspx. Понадобился время, чтобы понять, почему мои маршруты не были настроены.

Ответ 8

Экзамен Microsoft.NET 4.0 по веб-разработке (70-519) имеет почти этот точный вопрос в подготовительных материалах. Ответ, по словам Microsoft, заключается в следующем:

  • Преобразование веб-форм в веб-приложение (т.е. проект webapp).
  • Добавьте ссылки на "сборки ASP.NET MVC 2" в конфигурационном файле webapp.

Эта информация находится в платных материалах, которые мой работодатель приобрел, поэтому нет необходимости в веб-странице, в которой это четко указывается, на что я мог бы ссылаться.