我在Visual Studio 2008 SP1中有一个遗留的(哈哈) ASP.Net Webforms 网站项目 ,我想逐渐介绍一些MVC功能。
我可以找到关于如何将ASP.Net MVC与WebForms集成的大部分信息似乎都假定使用 Web应用程序项目 。但是,似乎无法找到有关如何使用ASP.Net MVC功能改进现有ASP.net网站项目的信息。
我已经审核了他即将出版的书中的Scott Hanselman's post和Chapter 13,这两本书都采用 Web应用程序项目类型。
这可能吗?有没有人对此有所了解?
答案 0 :(得分:24)
对于初学者来说,将MVC添加到webforms项目非常简单,要获得VS 2008 for MVC中的功能需要更多的工作(仍然很容易)。首先,您要确保引用程序集并使用.Net 3.5。其次,您可以在当前的Web表单项目中创建一个controllers文件夹和views文件夹。您还可以使用索引操作创建一个简单的控制器。然后在global.ascx文件中设置/配置路由。你应该从那里开始。请查看here以供参考。
但是,您只能使用代码隐藏创建aspx页面(您可以删除它们并在标记中输入正确的继承类)。实际上“转换”你的项目类型,以便你获得MVC和visual studio的好处(添加新的视图,goto控制器等)将需要一些游戏。我最好的建议是在VS 2008中创建一个新的MVC项目和一个新的Web App项目,并以纯文本格式比较.csproj文件。有一个长字符串值告诉VS项目模板。
相信我这确实有效。我之前在我自己的遗留项目上做过。我不记得除了试验/错误/消除之外我是如何找到项目类型“密钥”的。 ASP.Net MVC在与webforms相同的项目中确实表现不错。
更新:我认为您可以更改为MVC项目类型,它仍然是一个Web应用程序,在.csproj文件的PropertyGroup中使用它们。将这些与您所拥有的相比较并更改不同的那个,请务必复制/备份该文件。
<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之路。
答案 1 :(得分:19)
我想我会使用Visual Studio 2010 SP1 / NuGet / Scott Hanselman完全不支持的实用程序给出更新的答案。
这将为项目添加所有必需的dll,javascript文件,web.config设置更改等。如果一切顺利,您应该可以按F5,导航到您网站上的“home”,并查看由mvc呈现的示例表单:“欢迎使用ASP.NET MVC,使用NuGet包以完全不受支持的方式升级汉塞尔曼!没有保修!“。
答案 2 :(得分:7)
对于WebSite项目,您只需要将控制器添加到App_Code,而不是根目录。你会错过一些VS善良 - 因为它不知道你在没有csproj文件的情况下使用MVC,但你实际上会让它工作。
请记住继承自Controller和ViewPage,你应该做得很好。
答案 3 :(得分:6)
我有一个非常大的ASP.NET网站(不是Web应用程序),并且想要添加MVC3。我没有选择改变项目的类型,所以我不得不使用网站(asp.net 4.0)。
我使用单独的MVC项目,但不是它自己的Web应用程序,而是作为我旧网站中的程序集。
以下是我所做的事情的简要说明:
在网站上添加了路由。我只是复制了我网站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>
最初我还在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或我的基本控制器调用相同的方法。
到目前为止,我还没有看到任何关于这种方法的真正否定。
答案 4 :(得分:2)
只要在web.config中设置路由,设置必要的目录结构,并在global.asax中添加正确的路由,理论上就可以将MVC项添加到任何Web项目中。据我所知,这是它工作的唯一要求。
然而,两者的结合可能有点令人困惑,并且难以长期保持。也许您可以将所有现有的Web表单站点内容移动到子文件夹中,以使其不受影响,并保持站点的根目录清洁,以减少混乱并使事情更加清晰。
答案 5 :(得分:1)
如果你想将MVC 3添加到一个asp.net网站而不是web项目,那么Scott Hanselman的AddMvc3ToWebForms nuget包将会让你99%的方式,但在安装过程中会抛出一个你可以忽略的错误(我想,至少在我的测试中,这似乎是这种情况),安装后需要几个简单的步骤。
http://delradiesdev.blogspot.com/2011/08/adding-mvc-3-to-aspnet-web-site.html
的完整详情马克(@delradie)
答案 6 :(得分:0)
我学习的东西,在尝试迁移MVC2应用程序时,您的项目需要Default.aspx。我的任务是将一些GUI功能添加到现有的Web服务项目中,因此没有default.aspx。我花了一些时间来弄清楚为什么我的路线没有设置。
答案 7 :(得分:0)
关于Web开发的Microsoft .NET 4.0考试(70-519)在准备材料中几乎有这个问题。据微软称,答案是:
此信息在我的雇主购买的付费材料中,因此不一定有一个网页明确说明我可以链接的内容。