Запуск MVC с существующим сайтом Webforms

#c# #asp.net #asp.net-mvc #asp.net-mvc-3 #webforms

#c# #asp.net #asp.net-mvc #asp.net-mvc-3 #веб-формы

Вопрос:

Я прочитал большинство, если не все различные статьи о добавлении MVC 3 на существующие сайты webforms. Я внес изменения в глобальный asax сайта webforms для поддержки MVC, а также изменения в web.config. Однако все еще есть некоторые проблемы.

  1. MVC 3 является жадным — по умолчанию он занимает корневой каталог сайта, поэтому при переходе к корню я перехожу на страницу ввода для mvc, а не на страницу webforms, что мне и нужно. Чтобы было понятно при переходе к корню, я хочу, чтобы он переходил к mysite.com/default.aspx . Чтобы исправить корень сайта, я добавляю

    маршруты.MapPageRoute(«SiteRoot», «», «~/Default.aspx») Однако затем это нарушает URL-адреса MVC, так что в итоге я получаю перепутанные URL-адреса, такие как

    http://localhost:86/default ?action=Indexamp; controller= Blog Как я могу это исправить, чтобы корень сайта переходил на webforms default.aspx и при этом мои URL-адреса MVC были правильными?

  2. MVC 3 разрывает совокупность HttpHandlers, которые использует веб-форма. В частности, я использую обработчик для добавления заголовков far future expires к изображениям и обработчик ресурсов для объединения таблиц стилей и файлов javascript. Само наличие любого маршрута в RegisterRoutes нарушает работу этих обработчиков, так что таблицы стилей не загружаются через обработчик ресурсов, и я теряю срок действия в будущем, и есть модуль httpcompression, который тоже перестает работать. Итак, как мне поддерживать мои httphandlers и модули для веб-форм, сохраняя при этом маршруты для части сайта MVC 3?

Эти 2 проблемы, которые я не видел, чтобы кто-либо рассматривал в различных сообщениях в блоге, касающихся смешивания MVC3 и webforms.

О, и у меня есть маршруты.IgnoreRoute(«{resource}.aspx/{*pathInfo}») в global.asax.Обработчик ресурсов использует расширение файла aspx, поэтому я бы подумал, что с этим исключением в глобальном, что приложение будет работать, но я думаю, что нет.

Другой известный мне вариант — создать папку внутри сайта wbeforms и запустить ее как собственную отправную точку приложения — однако в итоге я получаю URL, который мне действительно не нужен, например site.com/blog/blog/index где 1-й блог — это папка, работающая как собственная точка приложения, а второй блог — это контроллер.

Ответ №1:

Лучшее решение, которое я могу найти, — не смешивать MVC 3 с существующим сайтом webforms. Вместо этого установите каталог MVC в качестве собственной начальной точки приложения, а затем запустите MVC из этой папки, чтобы он и существующее приложение webforms не знали друг о друге. Таким образом, обработчик ресурсов, httpmodules и другие обработчики все еще работают для сайта webforms. И таким образом, корень домена переходит к webforms default.aspx, а не к MVC по умолчанию. Также мне не нужно помещать эту запись в global.asax, что, в свою очередь, испортило URL-адреса mvc 3. Следующая проблема заключалась в том, чтобы разобраться с URL-адресами, чтобы у меня не было URL-адреса lke blog/blog /post /1. Чтобы исправить это, я изменил ссылку на действие html на

 @Html.ActionLink(item.PostTitle, "Post", New With {.id = item.PostId}, Nothing)
 

А затем внесите изменения в global.asax — измените маршрут по умолчанию на (просто удалите {controller}:

 routes.MapRoute( _
        "Default", _
        "{action}/{id}", _
        New With {.controller = "Blog", .action = "Index", .id = UrlParameter.Optional}, New String() {"RiderDesignMvcBlog.Core.Controllers"})
 

Итак, теперь вместо blog / blog / index или blog / blog / post / 1 я получаю правильный чистый URL-адрес без дублирования блога в URL- blog / post / 1

Ответ №2:

Я предлагаю вам изменить расширение вашего обработчика как истинный обработчик, .ASHX , и вместо этого игнорировать их.