46

我在 Visual Studio 2008 SP1 中有一个旧版(哈哈) ASP.Net Webforms网站项目,我想逐步将一些 MVC 功能引入其中。

我能找到的关于如何将 ASP.Net MVC 与 WebForms 集成的大部分信息似乎都假设使用了Web 应用程序项目。但是,似乎不可能找到有关如何使用 ASP.Net MVC 功能改造现有 ASP.net 网站项目的信息。

我已经阅读了Scott Hanselman 的文章和他即将出版的书的第 13 章,这两本书都假定了Web 应用程序项目类型。

这可能吗?有没有人有这方面的方法?

4

8 回答 8

24

对于初学者来说,将 MVC 添加到 webforms 项目非常简单,要获得 VS 2008 for MVC 中的功能需要更多的工作(仍然很容易)。首先,您要确保引用程序集并使用 .Net 3.5。其次,您可以在当前的 Web 表单项目中创建一个控制器文件夹和视图文件夹。您还可以使用索引操作创建一个简单的控制器。然后在 global.ascx 文件中设置/配置路由。你应该从那里开始。在这里查看以供参考。

但是,您将只能创建带有代码隐藏的 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 的道路。

于 2009-02-20T22:53:34.280 回答
19

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

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

这会将所有必要的 dll、javascript 文件、web.config 设置更改等添加到项目中。如果一切顺利,您应该可以按 F5,导航到您网站上的“主页”,然后看到 mvc 呈现的示例表单:“欢迎使用 ASP.NET MVC,以完全不受支持的方式使用 NuGet 包升级汉塞尔曼!没有保修!”。

于 2011-04-08T15:41:05.333 回答
7

对于网站项目,您只需将控制器添加到 App_Code,而不是根。你会错过一些 VS 的优点——因为它不知道你正在使用没有 csproj 文件的 MVC,但你实际上会让它工作。

只要记住从 Controller 和 ViewPage 继承就可以了。

于 2010-01-26T15:06:24.687 回答
6

我有一个相当大的 ASP.NET 网站(不是 Web 应用程序),并且想向其中添加 MVC3。我没有选择更改项目类型,所以我不得不使用网站(asp.net 4.0)。

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

以下是我所做的简要说明:

  • 我在 Visual Studio 2010 中创建了一个新的 MVC3 Web 应用程序,我使用了空模板和 Razor 视图引擎。
  • 我将它添加到现有网站的解决方案中。
  • 我将程序集的输出路径从本地 bin 目录更改为我网站的 bin 目录。
  • 我从 MVC 应用程序中删除了“内容”和“脚本”文件夹。内容和脚本都已经是我网站的一部分,我也可以从 MVC 的“页面”中引用它们。
  • 我从项目中删除了 Global.asax.* 文件。我在网站上使用 Global.asax。
  • 我将“视图”文件夹和子文件夹复制到网站上。因为这些是实际文件而不是程序集的一部分,所以它们必须存在于网站中,而不是构建 MVC 程序集的项目中。
  • 在这一点上,我可以从 MVC 项目中删除“视图”文件夹,但只有在这种项目类型中,我才能获得 Visual Studio 对添加新视图的支持。所以我有时会在这里创建一个视图,然后将它移到网站上。在我的网站上编辑 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>

最初,我还向 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 或我的基本控制器中调用相同的方法。

到目前为止,我还没有看到任何关于这种方法的真正负面影响。

于 2012-01-17T09:36:43.190 回答
2

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

但是,从长远来看,两者的结合可能会有点混乱且难以维护。也许您可以将所有现有的 Web 表单站点内容移动到一个子文件夹中,以使其不碍事,并保持站点的根目录干净,以减少混乱并使事情更加清晰。

于 2009-02-20T22:53:24.047 回答
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)

于 2011-08-04T13:48:46.030 回答
0

在尝试迁移 MVC2 应用程序时,我学到的是您的项目需要 Default.aspx。我的任务是向现有的 Web 服务项目添加一些 GUI 功能,因此没有 default.aspx。我花了一段时间才弄清楚为什么我的路线没有设置好。

于 2010-07-19T11:57:23.650 回答
0

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

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

此信息在我的雇主购买的付费材料中,因此不一定有一个网页清楚地说明它,我可以链接到它。

于 2011-07-27T13:16:58.310 回答