大多数关于如何将ASP.Net MVC与WebForms集成的信息似乎都假定使用Web应用程序项目。然而,似乎不可能找到有关如何将现有的ASP.net Web Site Project改装为具有ASP.Net MVC功能的信息。
我已经查看了Scott Hanselman的帖子和他即将出版的书的第13章,两者都假定使用Web Application Project类型。
这可行吗?有人有关于此的操作指南吗?
首先,在 WebForms 项目中添加MVC是相当简单的,但要在 VS 2008 中使用 MVC 的功能需要进行一些额外的工作(仍然很容易)。首先,确保引用了所需的程序集并且正在使用 .Net 3.5。其次,可以在当前 WebForms 项目中创建控制器文件夹和视图文件夹,还可以创建一个简单的带有索引操作的控制器。然后,在 global.ascx 文件中设置/配置路由。从那里开始就可以了。参考此处。
但是,您只能创建具有代码后备的 aspx 页面(可以删除它们并在标记中输入正确的继承类)。实际上“转换”项目类型以获取 MVC 和 Visual Studio(添加新视图、转到控制器等)的优点需要进行一些尝试。我最好的建议是在 VS 2008 中创建一个新的 MVC 项目和一个新的 Web 应用程序项目,并比较纯文本中的 .csproj 文件。有一个长字符串值告诉 VS 项目模板。
相信我,这确实有效。我已经在自己的遗留项目上完成了此操作。除了试错/消除之外,我不记得如何找到项目类型“key”。ASP.Net MVC 在同一项目中与 WebForms 兼容。
更新:我认为您可以使用以下内容在 PropertyGroup 的 .csproj 文件中更改为 MVC 项目类型,这仍然是 Web 应用程序。将其与您拥有的内容进行比较并更改不同的部分,确保复制/备份文件。
<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 的完全不支持的实用工具来更新答案。
这将向项目添加所有必要的 dlls、javascript 文件、web.config 设置更改等。如果一切顺利,您应该能够按 F5 键,导航到您网站上的 "主页",并看到一个由 MVC 渲染的样本表单:"欢迎使用 ASP.NET MVC,由 Hanselman 在完全不支持的情况下通过 NuGet 包进行升级!无保修!"。
对于一个网站项目,您只需要将控制器添加到App_Code而不是根目录。这样做会使您错过一些VS的好处-因为没有csproj文件,它不知道您正在使用MVC,但实际上您可以让它正常工作。
只需记住继承Controller和ViewPage,您就应该没问题了。
Added Routing to the web site. I just copied over some code from an MVC global.asax in the global.asax of my web site. We need some usings:
using System.Web.Mvc;
using System.Web.Routing;
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 }
);
如果你想将MVC 3添加到一个asp.net网站而不是Web项目中,那么Scott Hanselman的AddMvc3ToWebForms nuget包可以让你完成99%的工作,但在安装过程中会抛出一个错误,你可以安全地忽略它(至少在我的测试中似乎是这样),安装后需要进行一些简单的步骤。
有关详细信息,请参见http://delradiesdev.blogspot.com/2011/08/adding-mvc-3-to-aspnet-web-site.html
Mark (@delradie)
微软.NET 4.0 Web开发考试(70-519)的准备材料中几乎有这个确切的问题。根据微软当时的答案:
这些信息是我雇主购买的付费材料中的,因此不一定有一个明确说明的网页可以链接到。