我在Visual Studio 2008 SP1中有一个遗留(哈哈) ASP.Net Webforms 网站项目,我想逐步介绍一些MVC功能.
我可以找到关于如何将ASP.Net MVC与WebForms集成的大部分信息似乎都假定使用Web应用程序项目.但是,似乎无法找到有关如何使用ASP.Net MVC功能改进现有ASP.net网站项目的信息.
我已经回顾了Scott Hanselman的帖子以及他即将出版的书中的第13章,这两本书都假设了Web Application Project类型.
这可能吗?有没有人有这方面的方法?
对于初学者来说,将MVC添加到webforms项目非常简单,要获得VS 2008 for MVC中的功能需要更多的工作(仍然很容易).首先,您要确保引用程序集并使用.Net 3.5.其次,您可以在当前的Web表单项目中创建一个controllers文件夹和views文件夹.您还可以使用索引操作创建一个简单的控制器.然后在global.ascx文件中设置/配置路由.你应该从那里开始.点击这里查看参考.
但是,您只能使用代码隐藏创建aspx页面(您可以删除它们并在标记中输入正确的继承类).实际上"转换"你的项目类型,以便你获得MVC和visual studio的好处(添加新的视图,转到控制器等)将需要一些游戏.我最好的建议是在VS 2008中创建一个新的MVC项目和一个新的Web App项目,并以纯文本格式比较.csproj文件.有一个长字符串值告诉VS项目模板.
相信我这确实有效.我之前在我自己的遗留项目上做过.我不记得除了试验/错误/消除之外我是如何找到项目类型"密钥"的. ASP.Net MVC在与webforms相同的项目中确实很好玩.
更新:我认为您可以更改为MVC项目类型,它仍然是一个Web应用程序,通过在.csproj文件的PropertyGroup中使用它们.将这些与您所拥有的相比较并更改不同的那些,请务必复制/备份该文件.
{B99EC98A-1F09-4245-B00D-5AF985190AA9} {603c0e0b-db56-11dc-be95-000d561079b0};{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}
更新2:您不会影响您的项目或影响它.如果你不容易,那就备份并玩游戏吧.如果您遇到更改,您将始终拥有备份.起初我很怀疑,但很高兴我走上了MVC之路.
我想我会使用Visual Studio 2010 SP1/NuGet/Scott Hanselman完全不支持的实用程序给出更新的答案.
安装MVC3(w/nuget) http://www.asp.net/mvc/mvc3
转到Visual Studio中的"工具"菜单,然后选择"库包管理器"\"包管理器控制台"
出现控制台窗口后,将"默认项目"更改为您的webforms项目.
键入"Install-Package AddMvc3ToWebForms"(http://nuget.org/List/Packages/AddMvc3ToWebForms)
这将为项目添加所有必要的dll,javascript文件,web.config设置更改等.如果一切顺利,您应该可以按F5,导航到您网站上的"home",并查看由mvc呈现的示例表单:"欢迎使用ASP.NET MVC,使用NuGet包以完全不受支持的方式升级汉塞尔曼!没有保修!"
对于WebSite项目,您只需要将控制器添加到App_Code,而不是根目录.你会错过一些VS善良 - 因为它不知道你在没有csproj文件的情况下使用MVC,但你实际上会让它工作.
只记得继承自Controller和ViewPage,你应该做得很好.
我有一个非常大的ASP.NET网站(不是Web应用程序),并希望将MVC3添加到它.我没有选择改变项目的类型,所以我不得不使用网站(asp.net 4.0).
我使用单独的MVC项目,但不是它自己的Web应用程序,而是作为我旧网站中的程序集.
这是我所做的事情的简要说明:
我在Visual Studio 2010中创建了一个新的MVC3 Web应用程序,我使用了空模板和Razor视图引擎.
我将其添加到现有网站的解决方案中.
我将程序集的输出路径从本地bin目录更改为我的Web站点的bin目录.
我从MVC应用程序中删除了"内容"和"脚本"文件夹.内容和脚本都已经是我网站的一部分,我也可以从MVC的"页面"中引用它们.
我从项目中删除了Global.asax.*文件.我在网站上使用Global.asax.
我将"Views"文件夹和子文件夹复制到了网站上.因为这些是实际文件而不是程序集的一部分,所以它们必须存在于Web站点中而不是构建MVC程序集的项目中.
此时我可以从MVC项目中删除'Views'文件夹,但只有在这个项目类型中我才能获得Visual Studio支持添加新视图.所以我有时会在这里创建一个视图,然后将其移到网站上.在我的网站上编辑cshtml文件时,我仍然可以获得完整的智能感知.
添加了路由到网站.我只是复制了我网站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中,我们需要以下程序集:
最初我还在web.config中添加了一些MVC命名空间,但没有它们似乎工作正常.
您现在可以在网站的Global.asax中创建新路由,然后在MVC项目中添加相应的控制器,然后返回到网站以为其添加视图.所以你的逻辑都在一个程序集中,而视图和路由在网站中定义.
您仍然可以通过在那里设置断点来调试MVC控制器,但是您可以通过启动网站进行调试.
如果您使用建议的MVC默认路由:
routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
对www.mysite.com的调用将提供家庭控制器/视图的内容,而不是旧的default.aspx主页,所以我只是不使用这样的路由.如果与现有物理文件夹和文件路由冲突,请在路由上使用带有正则表达式的约束来排除此类冲突.
即使我在网站中使用母版页,公共页面部分的实际html也是由另一个程序集中的代码创建的.我可以从我的_ViewStart.cshtml或我的基本控制器调用相同的方法.
到目前为止,我还没有看到任何关于这种方法的真正否定.