你如何将ASP.Net MVC融入现有的网站项目?

我在Visual Studio 2008 SP1中有一个遗留的(哈哈) ASP.Net Webforms Web站点项目 ,我想逐步引入一些MVCfunction。

我可以find关于如何将ASP.Net MVC与WebForms集成的大多数信息似乎假定使用Web应用程序项目 。 但是,使用ASP.Net MVCfunctionfind有关如何改造现有ASP.net网站项目的信息似乎是不可能的。

我已经回顾了Scott Hanselman的文章和他即将出版的书的第13章 ,这两本书都假设了Web Application Projecttypes。

这可能吗? 有没有人有这个方法?

对于初学者来说,将MVC添加到webforms项目中非常简单,为了获得MVC中的function,需要做更多的工作(仍然很容易)。 首先你要确保你引用的程序集,并使用.NET 3.5。 其次,您可以在当前Web窗体项目中创build一个控制器文件夹和视图文件夹。 您也可以使用索引操作创build一个简单的控制器。 然后在global.ascx文件中设置/configuration路由。 你应该从那里设置。 在这里检查参考。

但是,您只能创build带有代码的aspx页面(您可以删除这些页面并在标记中input正确的inheritance类)。 实际上“转换”你的项目types,以便你得到MVC和视觉工作室的好处(添加新的视图,转到控制器等)将采取一些玩弄。 我最好的build议是在VS 2008中创build一个新的MVC项目和一个新的Web App项目,并以纯文本格式比较.csproj文件。 有一个很长的string值告诉VS项目模板。

相信我,这工作。 我以前在我自己的遗留项目上做过。 除了试用/错误/消除之外,我不记得我是如何find项目types“钥匙”的。 ASP.Net MVC确实和webforms在同一个项目中玩的很好。

更新:我认为你可以改变为一个MVC项目types,它仍然是一个Web应用程序,通过在.csproj文件的PropertyGroup中使用这些types。 比较这些和你有什么不同,请确保复制/备份文件。

<ProjectGuid>{B99EC98A-1F09-4245-B00D-5AF985190AA9}</ProjectGuid> <ProjectTypeGuids>{603c0e0b-db56-11dc-be95-000d561079b0};{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids> 

更新2:你不会影响你的项目或影响很大。 如果你不方便做备份和游戏。 如果您遇到更改,您将始终拥有备份。 我一开始很怀疑,但很高兴我走下了MVC的道路。

我想我会使用Visual Studio 2010 SP1 / NuGet / Scott Hanselman完全不支持的实用程序给出更新的答案。

  1. 安装MVC3(w / nuget) http://www.asp.net/mvc/mvc3
  2. 转到Visual Studio中的“工具”菜单并select“库包pipe理器”\“包pipe理器控制台”
  3. 一旦出现控制台窗口,将“默认项目”更改为您的webforms项目。
  4. 键入“Install-Package AddMvc3ToWebForms”( http://nuget.org/List/Packages/AddMvc3ToWebForms

这将添加所有必要的DLL,JavaScript文件,web.config设置更改等等到项目。 如果一切顺利,你应该能够按F5,导航到你的网站上的“home”,并看到一个由mvc呈现的示例表单:“欢迎使用ASP.NET MVC,以完全不受支持的方式升级到NuGet包Hanselman!没有保修!“

对于WebSite项目,您只需将控制器添加到App_Code,而不是根。 你会错过一些VS的好处 – 因为它不知道你使用的MVC没有csproj文件,但你会真正得到它的工作。

只要记得从Controller和ViewPageinheritance,你应该是好的。

我有一个很大的ASP.NET网站(而不是一个Web应用程序),并希望添加到它的MVC3。 我没有select改变项目的types,所以我不得不去与网站(asp.net 4.0)。

我使用一个单独的MVC项目,但不是它自己的Web应用程序,而是作为我的旧网站中的程序集。

以下是我所做的一些事情:

  • 我在Visual Studio 2010中创build了一个新的MVC3 Web应用程序,我使用了空模板和Razor视图引擎。
  • 我把它添加到我现有的网站的解决scheme。
  • 我将程序集的输出path从本地bin目录更改为我的网站的bin目录。
  • 我从MVC应用程序中删除了“内容”和“脚本”文件夹。 内容和脚本都已经是我的网站的一部分,我也可以从MVC的“页面”中引用它们。
  • 我从项目中删除了Global.asax。*文件。 我在网站上使用Global.asax。
  • 我将“Views”文件夹和子文件夹复制到网站上。 因为这些是实际文件而不是程序集的一部分,所以它们必须存在于网站中,而不是构buildMVC程序集的项目。
  • 在这一点上,我可以从MVC项目中删除“Views”文件夹,但只有在这个项目types中,我才能获得Visual Studio的支持来添加一个新的视图。 所以我有时在这里创build一个视图,然后移动到网站。 在我的网站上编辑cshtml文件时,我仍然得到完整的Intellisense。
  • 添加到网站的路由。 我只是从我的网站global.asax中的MVC global.asax复制了一些代码。 我们需要一些使用:

     using System.Web.Mvc; using System.Web.Routing; 

在Application_Start中我们需要:

  AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); 

然后添加通常的路由方法:

  public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); } public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); // your routes } 

接下来添加一些东西到您的网站的web.config。 在编译的system.web中,我们需要下列程序集:

  <assemblies> <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> </assemblies> 

最初,我还添加了一些MVC命名空间到web.config,但它似乎没有他们正常工作。

您现在可以在Web站点的Global.asax中创build新路由,然后在MVC项目中添加相应的控制器,然后返回到网站以添加视图。 所以你的逻辑都是在一个组件中,而视图和路由是在网站中定义的。

您仍然可以通过在那里设置中断点来debuggingMVC控制器,但是通过启动网站进行debugging。

如果您使用build议的默认路由MVC:

  routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); 

一个www.mysite.com的调用将提供家庭控制器/视图的内容不是你的旧的default.aspx主页,所以我只是不使用这样的路线。 如果将冲突与现有的物理文件夹和文件路由,请在路由上使用正则expression式的约束来排除此类冲突。

即使我在网站中使用母版页,通用页面部件的实际html也是由另一个程序集中的代码创build的。 我可以从我的_ViewStart.cshtml或我的基本控制器调用相同的方法。

到目前为止,我还没有看到这种方法的真正负面。

只要在web.config中设置路由,设置必要的目录结构,并在global.asax中添加正确的路由,理论上可以将MVC项目添加到任何Web项目。 据我所知,这是它工作的唯一要求。

然而,两者的结合可能会有点混乱,难以长期保持。 也许你可以将所有现有的网站forms的网站内容转移到一个子文件夹,以保持它的方式,并保持网站的根目录干净,以减less混乱,让事情更清楚。

如果你想添加MVC 3到一个asp.net网站,而不是web项目,那么Scott Hanselman的AddMvc3ToWebForms nuget包会让你有99%的路,但会在安装过程中抛出一个错误,你可以毫不理睬地(至less我觉得在我的testing中,这似乎是这种情况),安装后需要几个简单的步骤。

http://delradiesdev.blogspot.com/2011/08/adding-mvc-3-to-aspnet-web-site.html上的完整详细信息;

马克(@delradie)

我学习的东西,而尝试迁移MVC2应用程序是你的项目需要一个Default.aspx。 我的任务是将一些GUIfunction添加到现有的Web服务项目,因此没有default.aspx。 花了我一会儿来弄清楚为什么我的路线没有设置。

Web开发(70-519)上的Microsoft .NET 4.0考试在准备材料中几乎有这个确切的问题。 微软认为,答案是:

  1. 将Web表单网站转换成Web应用程序(即webapp项目)。
  2. 在webapp的configuration文件中添加对“ASP.NET MVC 2程序集”的引用。

这个信息是在我的雇主购买的付费材料,所以不一定有一个网页明确说明,我可以链接。