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