您如何将ASP.Net MVC纳入现有网站项目?

时间:2009-02-20 21:35:09

标签: asp.net asp.net-mvc visual-studio web-site-project

我在Visual Studio 2008 SP1中有一个遗留的(哈哈) ASP.Net Webforms 网站项目 ,我想逐渐介绍一些MVC功能。

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

我已经审核了他即将出版的书中的Scott Hanselman's postChapter 13,这两本书都采用 Web应用程序项目类型。

这可能吗?有没有人对此有所了解?

8 个答案:

答案 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完全不支持的实用程序给出更新的答案。

  1. 安装MVC3(带有nuget) http://www.asp.net/mvc/mvc3
  2. 转到Visual Studio中的“工具”菜单,然后选择“库包管理器”\“包管理器控制台”
  3. 出现控制台窗口后,将“默认项目”更改为您的webforms项目。
  4. 输入“Install-Package AddMvc3ToWebForms”(http://nuget.org/List/Packages/AddMvc3ToWebForms
  5. 这将为项目添加所有必需的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应用程序,而是作为我旧网站中的程序集。

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

  • 我在Visual Studio 2010中创建了一个新的MVC3 Web应用程序,我使用了空模板和Razor视图引擎。
  • 我将其添加到现有网站的解决方案中。
  • 我从本地bin更改了程序集的输出路径 目录到我的网站的bin目录。
  • 我从MVC应用中删除了“内容”和“脚本”文件夹。都 内容和脚本已经是我网站的一部分,我可以 从MVC'pages'中引用这些。
  • 我从项目中删除了Global.asax。*文件。我在网站上使用Global.asax。
  • 我将'Views'文件夹和子文件夹复制到网站上。因为这些是 实际文件而不是组件的一部分,它们必须存在于网站内 而不是构建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中,我们需要以下程序集:

     <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)在准备材料中几乎有这个问题。据微软称,答案是:

  1. 将网络表单网站转换为网络应用程序(即webapp项目)。
  2. 在webapp的配置文件中添加对“ASP.NET MVC 2程序集”的引用。
  3. 此信息在我的雇主购买的付费材料中,因此不一定有一个网页明确说明我可以链接的内容。