将 ASP.Net MVC 与 WebForms 相结合
Posted
技术标签:
【中文标题】将 ASP.Net MVC 与 WebForms 相结合【英文标题】:Combine ASP.Net MVC with WebForms 【发布时间】:2011-01-13 06:56:44 【问题描述】:是否可以创建一个 MVC 根应用程序(带有母版页和主题的门户)并添加几个基于 WebForms 的子项目(我们已经有一个想要集成到门户中的现有 WebForms 应用程序)?
您将如何集中导航(站点地图、网址路由)? 您将如何共享母版页? 您如何引用资源(〜问题等)?
【问题讨论】:
【参考方案1】:将 Web 表单与 MVC 相结合是完全可能的。有关介绍,请参阅this blog post by Scott Hanselman。
分享母版页:see this *** question 路由:在 ASP.Net 4.0 中,routing has been enabled for web forms page routes (scottgu's blog)【讨论】:
很棒的帖子,我在做同样事情时使用的所有链接。【参考方案2】:作为参考,我昨天设法完成了这项任务 - 将 MVC 功能添加到现有的 WebForms 网站,所以我想我会写,以防它对任何人有任何用处。
人们说:“最好的方法是将您的 Web 表单应用程序重写为 MVC”,但是当应用程序已经很好地建立并且随着时间的推移已经发展成为一个怪物(仍然运作良好)时,通常没有商业案例来解决这个问题我可能会补充)。在我的例子中,我们被要求在这个应用程序中实现一个新功能——并且最近在其他项目中使用 MVC 进行开发——我想在 MVC 中构建这个新功能。这就是我所做的:
创建一个新的 ASP.NET MVC 4 应用程序并选择 Empty Template(使用 Razor)
加载后,右键单击 References > 浏览,然后导航到我现有网站的 Bin 文件夹。然后我添加了我在现有站点中使用的 DLL。作为参考,我正在使用 AjaxControlToolkit,因此决定添加来自 NuGet 的最新版本。这应该会自动更新 web.config 文件
然后我打开 Windows Explorer 并导航到我现有网站的根文件夹。然后,我使用 Visual Studio 复制了现有站点的 ***文件夹结构(减去 Bin 文件夹),导致 2 个站点具有相同的***文件夹(但新项目具有 MVC App_Start、Controllers、Models 和 Views 文件夹也有,但显然 Bin 没有)。
设置完成后,我从 Windows Explorer 的相应***文件夹中复制了子文件夹和文件,并将它们粘贴到解决方案中。如果您这样做,该项目允许您直接复制子文件夹和内容,通过 Visual Studio 添加现有项目仅复制文件,从而节省时间。请注意:对于根文件夹,我在 web.config 或 Global.asax 中进行了 NOT 复制,但复制到了所有其他文件中(例如default.aspx 等)
复制完所有内容后,我在新项目中打开了 web.config,在现有站点中打开了 web.config。我将特定于现有网站的任何内容(appSettings、connectionStrings、命名空间、会员信息等)复制到新的 web.config 中。这同样适用于 Global.asax 文件。
我尝试构建并修复了我错过的任何内容。
一旦一切正常(并且我击落了几个黄屏死机),我注意到加载 default.aspx 时出现页面未找到错误。这取决于路由,这是我对路由信息所做的更改(位于 Global.ascx MVC 3 或 App_Start > RouteConfig.cs MVC 4):
public static void RegisterRoutes(RouteCollection routes)
routes.IgnoreRoute("resource.axd/*pathInfo");
// This informs MVC Routing Engine to send any requests for .aspx page to the WebForms engine
routes.IgnoreRoute("resource.aspx/*pathInfo");
routes.IgnoreRoute("resource.aspx");
// Important change here: removed 'controller = "Home"' from defaults. This is the key for loading
// root default page. With default setting removed '/' is NOT matched, so default.aspx will load instead
routes.MapRoute(
name: "Default",
url: "controller/action/id",
defaults: new action = "Index", id = UrlParameter.Optional
);
完成所有这些步骤后,网站像往常一样加载和运行,但我现在有了一个 ASP.NET WebForms 和 MVC 混合体。我确信可能有更简单的方法可以完成这项任务,但我尝试了其他方法并失败了。这种方式花了我大约 20 分钟,然后我就开始跑步了......很好地坐着和编码:)
【讨论】:
这很快又很有帮助;简单。我还能够使用标准的添加对话框向 MVC 项目添加更多 Web 表单页面。如果我想同时添加较旧的 web 表单页面,而且还想添加 MVC Razor 页面,这是必须的。【参考方案3】:上面的答案很好。您可以考虑的另一件事是从 ASP.NET 迁移到 ASP.NET MVC,在这种情况下 this post might help you 迁移项目文件。
【讨论】:
【参考方案4】:我太困在这种情况下,毕竟我找到了一个可行的解决方案,首先将web.config
复制到您的视图文件夹中。
打开Route.config(Routeconfig)
文件后,你会找到一个方法RegisterRoutes
,保持原样并创建另一个名为RegisterRoutes2()
的方法,然后从mvc应用程序中复制粘贴以下方法代码:
public static void RegisterRoutes2(RouteCollection routes)
...
在某些情况下,mvc 应用程序中的方法名称是 RegisterRoutes。
如果上面的代码不起作用,请从您机器的 mvc 应用程序中复制粘贴它。
然后,进入global.asax
文件,你会发现RegisterRoutes()
已经被调用了,现在简单,也调用RegisterRoutes2()
。
你完成了,重新启动你的应用程序,或者清理构建,它就会运行。
【讨论】:
以上是关于将 ASP.Net MVC 与 WebForms 相结合的主要内容,如果未能解决你的问题,请参考以下文章
基于 jQuery 的专业 ASP.NET WebForms/MVC 控件库!
从 ASP.NET WebForms 迁移到 ASP.NET MVC 的建议?