#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. Однако все еще есть некоторые проблемы.
- 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 были правильными?
- 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
, и вместо этого игнорировать их.