c# - 使用现有 Webforms 站点运行 MVC

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

我阅读了大部分关于将 MVC 3 添加到现有 Web 表单站点的各种文章(如果不是全部的话)。我对 webforms 站点的全局 asax 进行了更改以支持 MVC 以及对 web.config 的更改。但是仍然存在一些问题。

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

    routes.MapPageRoute("SiteRoot", "", "~/Default.aspx") 然而,这会破坏 MVC url,这样我最终会得到像

    这样的乱七八糟的 url

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

  2. MVC 3 破坏了网络表单使用的一对 HttpHandler。具体来说,我使用一个处理程序将远期到期的 header 添加到图像中,并使用一个资源处理程序来组合样式表和 javascript 文件。 RegisterRoutes 中任何路由的纯粹存在会破坏这些处理程序,因此样式表不会通过资源处理程序加载,我失去了遥远的 future 到期,并且有一个 httpcompression 模块也停止工作。那么,我该如何维护 Web 表单的 httphandlers 和模块,同时仍然保留网站的 MVC 3 部分的路由?

这 2 个问题我没有看到任何人在各种关于混合 MVC3 和 webforms 的博客文章中解决。

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

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

最佳答案

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

所以现在我得到了一个正确的干净的 url,而不是 blog/blog/index 或 blog/blog/post/1,url 中没有重复的博客 - blog/post/1

关于c# - 使用现有 Webforms 站点运行 MVC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7889747/

相关文章:

asp.net - 如何在 ASP.NET MVC 中渲染 HTML 字符串?

asp.net-mvc - MVC 4 限制所有操作/ Controller ,除非管理员或角色/用户允许

asp.net-mvc - ASP.NET MVC + FluentValidation + PartialView > 无客户端验证

javascript - 如何在 DropdownList 更改后刷新页面以便执行 JavaScript

asp.net-mvc - MVC3 自定义输出缓存

C# TimeZoneInfo 将 GMT 时区名称转换为系统时区

c# - 为什么 Visual Studio 2012 不能格式化这个有效的 Razor 代码

c# - 缩小返回类型是一个重大变化吗?

c# - 无法通过 VS2012 使用 Monogame 加载内容

asp.net - 如何允许匿名访问我的 IIS 站点,但使用 Windows 身份验证连接到 SQL Server?