将ASP.Net MVC与WebForms相结合
是否有可能创build一个MVC根应用程序(带有主页和主题的门户),并添加一对基于WebForms的子项目(我们已经有一个现有的WebForms应用程序,我们想要集成到门户网站中)?
你将如何集中导航(站点地图,url路由)?
你将如何分享主页?
你如何参考资源(〜问题等)?
像这里描述的解决scheme似乎有些过时
将Web表单与MVC相结合是完全可能的。 请参阅Scott Hanselman的博客文章以获取相关介绍。
- 共享母版页: 看到这个StackOverflow的问题
- 路由:在ASP.Net 4.0中, 已经为web表单页面路由启用了路由(scottgu的博客)
作为参考,我昨天完成了这个任务 – 将MVCfunction添加到现有的WebForms网站,也就是说,我认为我会写,以防任何人使用它。
人们会说:“最好的方法就是把你的网页表单应用程序改写成MVC”,但是当应用程序已经build立起来,并且随着时间的推移,这个应用程序经常会变成一个怪物)。 在我的例子中,我们被要求在这个应用程序中实现一个新的function – 最近在MVC上开发了其他项目 – 我想在MVC中构build这个新function。 这就是我所做的:
-
创build一个新的ASP.NET MVC 4应用程序,并select空模板 (使用剃刀)
-
一旦加载,右键单击“ 参考” >“浏览”,然后导航到我现有网站的Bin文件夹。 然后我添加在我在现有的网站使用的DLL。 作为参考,我正在使用AjaxControlToolkit,所以决定从NuGet中添加最新的一个。 这应该会自动更新web.config文件
-
然后,我打开Windows资源pipe理器,并导航到我现有的网站的根文件夹。 然后使用Visual Studio复制现有站点的顶层文件夹结构 (减去Bin文件夹),导致2个站点具有相同的顶级文件夹(但具有MVC App_Start,控制器,模型和视图的新项目还有文件夹,但是Bin不明显)。
-
安装完成后,我从Windows资源pipe理器的相应顶层文件夹中复制子文件夹和文件,并将其粘贴到解决scheme中。 如果你这样做,该项目允许您直接复制子文件夹和内容,通过Visual Studio添加现有项目只复制文件,从而节省时间。 请注意:对于根文件夹,我没有复制web.config或Global.asax ,但复制在所有其他文件(如default.aspx等)
-
一旦所有的内容被复制,我打开web.config在新项目和web.config在现有的网站。 我复制到新的web.config任何特定于现有的网站(appSettings,connectionStrings,命名空间,会员信息等)。 这同样适用于Global.asax文件。
-
我试图build立和修复我错过的任何东西。
-
一旦一切正常(我已经击落了一些黄色的死亡屏幕),我注意到,我加载default.aspx时,我没有find页面错误。 这是路由,这是我对路由信息(位于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分钟左右,我起身跑步…好好坐着,编码:)
上面的好回答。 另一件事你可以考虑从ASP.NET迁移到ASP.NET MVC,在这种情况下, 这篇文章可能会帮助你迁移项目文件。
在这种情况下,我太困难了,毕竟我有一个解决scheme,首先将web.config
复制到视图文件夹中。
打开Route.config(Routeconfig)
文件之后,您会发现一个方法RegisterRoutes
,保持原样并创build另一个名为RegisterRoutes2()
方法,并从mvc应用程序中复制粘贴以下方法代码:
public static void RegisterRoutes2(RouteCollection routes) {...}
在某些情况下,mvc应用程序中的方法名称是RegisterRoutes。 如果上面的代码不起作用,请将其从机器的mvc应用程序复制粘贴。 然后,转到global.asax
文件,您会发现RegisterRoutes()
已被调用,现在简单,也调用RegisterRoutes2()
。 你完成了,重新启动你的应用程序,或清理构build,它会运行。