使用现有Webforms站点运行MVC

时间:2011-10-25 13:09:33

标签: c# asp.net asp.net-mvc asp.net-mvc-3 webforms

我读过有关将MVC 3添加到现有webforms网站的各种文章。我已经对webforms站点的全局asax进行了更改,以支持MVC以及对web.config的更改。但是仍然存在一些问题。

  1. MVC 3是贪婪的 - 默认情况下,它接管网站的根目录,以便导航到根目录,我转到mvc的入口页面,而不是我想要的webforms页面。要在导航到root时要清楚,我希望它转到mysite.com/default.aspx。要修复网站根目录,我添加

    routes.MapPageRoute(“SiteRoot”,“”,“〜/ Default.aspx”) 然而,这会打破MVC网址,这样我最终会搞乱像

    这样的网址

    http://localhost:86/default?action=Index&controller=Blog 我如何修复它,以便站点根目录转到webforms default.aspx并仍然让我的MVC网址正确?

  2. MVC 3打破了webform使用的HttpHandler。具体来说,我使用处理程序将远期未来的expires头添加到图像中,并使用资源处理程序来组合样式表和javascript文件。 RegisterRoutes中任何路由的存在都会破坏这些处理程序,以便样式表不会通过资源处理程序加载,并且我将失去远期的未来,并且还有一个httpcompression模块也会停止工作。那么如何在保留网站MVC 3部分路由的同时,为webforms维护我的httphandlers和模块呢?

  3. 这两个问题我没有看到有人在关于混合MVC3和webforms的各篇博客文章中提到过。

    哦,我在global.asax中有 routes.IgnoreRoute(“{resource} .aspx / {* pathInfo}”)。资源处理程序使用aspx文件扩展名,所以我会想到这个在全球范围内排除hanlder会起作用,但我猜不是。

    我知道的另一个选项是在wbeforms网站内设置一个文件夹并将其作为自己的应用程序起点运行 - 但是我最终得到了一个我真的不想要的网址,例如site.com/blog/blog/index第一个博客是作为自己的应用程序点运行的文件夹,第二个博客是控制器。

2 个答案:

答案 0 :(得分:1)

我能找到的最佳解决方案是将MVC 3与现有的webforms网站混合使用。而是将MVC目录设置为自己的应用程序起点,然后从该文件夹运行MVC,以便它和现有的webforms应用程序完全不知道彼此。以这种方式,资源处理程序和httpmodules以及其他处理程序仍然适用于webforms站点。通过这种方式,域根默认为webforms default.aspx而不是MVC。此外,我不必将该条目放入global.asax,这反过来搞砸了mvc 3网址。下一个问题是处理网址,以便我没有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"})

所以现在而不是博客/博客/索引或博客/博客/帖子/ 1我得到一个正确的干净网址没有网址中的重复博客 - 博客/帖子/ 1

答案 1 :(得分:0)

我建议您将处理程序的扩展名更改为真正的处理程序.ASHX,然后忽略它们。