将ASP.Net MVC与WebForms结合使用

问题描述 投票:41回答:4

是否可以创建MVC根应用程序(具有主页和主题的Portal)并添加几个基于WebForms的子项目(我们已经有一个现有的WebForms应用程序,我们想要集成到Portal中)?

您将如何集中导航(站点地图,网址路由)? 你会如何分享这些主页? 您如何参考资源(〜问题等)?

asp.net-mvc webforms master-pages sharing
4个回答
42
投票

将Web表单与MVC结合是完全可能的。请参阅this blog post by Scott Hanselman的介绍。


23
投票

作为参考,我昨天设法完成了这项任务 - 将MVC功能添加到现有的WebForms网站,即 - 我认为如果它对任何人都有用,我会写。

人们说:“最好的方法是将你的网络表单应用程序重写为MVC”但是当应用程序已经建立并且随着时间的推移逐渐成长为一个怪物时,通常没有商业案例(这仍然很好我可能会添加)。在我的例子中,我们被要求在这个应用程序中实现一个新函数 - 并且最近在其他项目中开发了MVC - 我想在MVC中构建这个新函数。这就是我做的:

  1. 创建一个新的ASP.NET MVC 4应用程序并选择空模板(使用Razor)
  2. 加载后,右键单击引用>浏览,然后导航到我现有网站的Bin文件夹。然后我添加了我在现有网站中使用的DLL。作为参考,我使用AjaxControlToolkit,因此决定添加NuGet中的最新版本。然后应该自动更新web.config文件
  3. 然后我打开了Windows资源管理器并导航到我现有网站的根文件夹。然后使用Visual Studio,我复制了现有站点的顶级文件夹结构(减去Bin文件夹),导致2个站点具有相同的顶级文件夹(但新项目具有MVC App_Start,控制器,模型和视图文件夹也,但明显不是Bin)。
  4. 设置完成后,我从Windows资源管理器中的相应顶级文件夹中复制了子文件夹和文件,并将它们粘贴到解决方案中。如果你这样做,项目允许你直接复制子文件夹和内容,通过visual studio添加现有项目只复制文件,从而节省时间。请注意:对于根文件夹,我没有复制到web.config或Global.asax,而是复制到所有其他文件(如default.aspx等)
  5. 复制完所有内容后,我在新项目中打开了web.config,在现有站点中打开了web.config。我将新的web.config复制到现有网站的任何特定内容(appSettings,connectionStrings,名称空间,成员资格信息等)。这同样适用于Global.asax文件。
  6. 我尝试了构建并修复了我错过的任何内容。
  7. 一切都是正确的(我已经击落了几个黄色的死亡屏幕)我注意到我在加载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分钟,我开始运行...很好坐和编码:)


5
投票

上面的答案很棒。您可以考虑的另一件事是从ASP.NET迁移到ASP.NET MVC,在这种情况下this post might help you迁移项目文件。


0
投票

我在这种情况下太过紧张,毕竟我得到了一个有效的解决方案,首先在你的views文件夹中复制web.config

在那之后打开Route.config(Routeconfig)文件,你会找到一个方法RegisterRoutes,保持原样并创建另一个名为RegisterRoutes2()的方法,并从mvc应用程序复制粘贴以下方法代码:

public static void RegisterRoutes2(RouteCollection routes)
{...}

在某些情况下,mvc app中的方法名称是RegisterRoutes。如果上面的代码不起作用,请从机器的mvc应用程序中复制粘贴它。然后,去global.asax文件,你会发现RegisterRoutes()已被调用,现在简单,也称为RegisterRoutes2()。您已完成,重新启动应用程序或清理构建,它将运行。

© www.soinside.com 2019 - 2024. All rights reserved.