如何将ASP.Net MVC引入现有的Web Site项目中?

46
我有一个老旧的ASP.Net Webforms网站项目,使用Visual Studio 2008 SP1,我希望逐步引入一些MVC功能。
大多数关于如何将ASP.Net MVC与WebForms集成的信息似乎都假定使用Web应用程序项目。然而,似乎不可能找到有关如何将现有的ASP.net Web Site Project改装为具有ASP.Net MVC功能的信息。
我已经查看了Scott Hanselman的帖子和他即将出版的书的第13章,两者都假定使用Web Application Project类型。
这可行吗?有人有关于此的操作指南吗?

2
这是关于如何将MVC项目添加到Webforms项目的逐步指南:j.mp/9Cbe7J - BritishDeveloper
8个回答

24

首先,在 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模式。


1
是的,理想情况下你是对的;你可能只想转换成一个Web应用程序项目。但是,我不想对现有的源代码树产生太大影响,而是想逐步引入一些MVC特性。 - Kris
1
这并没有回答问题。问题明确要求做一个网站项目,而不是一个 Web 应用程序。我认为另一个答案更符合所问的问题。 - Tom B
我已经想了好几个星期如何做到这一点...太棒了,答案。 - brad
这是一个很好的答案,但与问题无关。这是关于网站而不是Web项目,因此没有.csproj可供编辑。 - Nestor
-1 - Peter Hahndorf
显示剩余4条评论

19

我认为我可以使用 Visual Studio 2010 SP1 / NuGet / Scott Hanselman 的完全不支持的实用工具来更新答案。

  1. 安装MVC3 (w/ nuget) http://www.asp.net/mvc/mvc3
  2. 在Visual Studio中选择 "Tools" 菜单,然后选择 "Library Package Manager" \ "Package Manager Console"
  3. 一旦控制台窗口出现,将 "默认项目" 更改为您的WebForms项目。
  4. 键入 "Install-Package AddMvc3ToWebForms" (http://nuget.org/List/Packages/AddMvc3ToWebForms)

这将向项目添加所有必要的 dlls、javascript 文件、web.config 设置更改等。如果一切顺利,您应该能够按 F5 键,导航到您网站上的 "主页",并看到一个由 MVC 渲染的样本表单:"欢迎使用 ASP.NET MVC,由 Hanselman 在完全不支持的情况下通过 NuGet 包进行升级!无保修!"。


这个功能很好,但它不允许你右键单击“Controllers”文件夹并添加新的控制器或任何其他MVC上下文项。 - Dan VanWinkle
我收回之前的说法。那个脚本并没有卸载和重新加载我的项目,因为当时我正在编辑属性。如果你手动卸载和重新加载项目,上下文项目就会出现! - Dan VanWinkle
太棒了!感谢提供额外的信息。 - Jason
这个有没有MVC 4的更新版本? - Ziad
我在其他地方没有看到过这个,这看起来非常有用。+1 - Matt

7

对于一个网站项目,您只需要将控制器添加到App_Code而不是根目录。这样做会使您错过一些VS的好处-因为没有csproj文件,它不知道您正在使用MVC,但实际上您可以让它正常工作。

只需记住继承Controller和ViewPage,您就应该没问题了。


6
我有一个相当庞大的ASP.NET网站(不是Web应用程序),想要添加MVC3。由于无法更改项目类型,因此我只能使用网站(asp.net 4.0)。我使用了一个单独的MVC项目,但不是作为自己的Web应用程序,而是作为我的旧网站中的程序集。
以下是我所做的简要概述:
  • I created a new MVC3 web application in Visual Studio 2010, I used the empty template and the Razor view engine.
  • I added it to the solution with my existing web site.
  • I changed the output path for the assembly from the local bin directory to the bin directory of my web site.
  • I removed the 'Content' and 'Scripts' folders from the MVC app. Both content and scripts are already part of my web site and I can reference these from MVC 'pages' as well.
  • I removed the Global.asax.* files from the project. I am using the Global.asax in the web site.
  • I copied the 'Views' folder and subfolders over to the web site. Because these are actual files and not part of the assembly, they have to exist within the web site not the project that builds the MVC assembly.
  • At this point I could have deleted the 'Views' folder from the MVC project but it is only in this project type that I get Visual Studio support for adding a new view. So I sometimes create a view here and then move it over to the web site. When editing the cshtml files in my web site, I still get full Intellisense.
  • 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;
    
在 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或基本控制器中调用相同的方法。
到目前为止,我还没有看到任何负面影响。

2
只要在web.config中设置路由,设置必要的目录结构,并在global.asax中添加正确的路由,理论上可以将MVC项添加到任何Web项目中。据我所知,这些是它能够正常工作的唯一要求。
然而,两者的组合可能有点令人困惑和难以长期维护。也许您可以将所有现有的Web表单站点内容移动到子文件夹中,以使其不受干扰,并保持站点的根目录清洁,减少混乱,使事情更加清晰易懂。

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

Mark (@delradie)


0
在尝试迁移MVC2应用程序时,我学到的一件事是您的项目需要一个Default.aspx。我被要求将一些GUI功能添加到现有的Web Services项目中,因此没有default.aspx。花了我一段时间才弄清楚为什么我的路由没有被设置。

0

微软.NET 4.0 Web开发考试(70-519)的准备材料中几乎有这个确切的问题。根据微软当时的答案:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接