【问题标题】:How would you sprinkle-in ASP.Net MVC into an existing Web Site Project? [closed]您将如何将 ASP.Net MVC 嵌入到现有的网站项目中? [关闭]
【发布时间】:2010-10-08 22:48:34
【问题描述】:

我在 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 应用程序项目 类型。

这可能吗?有人知道这方面的方法吗?

【问题讨论】:

  • 这里是关于如何将 MVC 项目添加到 webforms 项目的分步指南:j.mp/9Cbe7J

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


【解决方案1】:

我有一个非常大的 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。
  • 我将“视图”文件夹和子文件夹复制到网站。因为这些是 实际文件而不是程序集的一部分,它们必须存在于网站中 而不是构建 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 或我的基本控制器中调用相同的方法。

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

【讨论】:

    【解决方案2】:

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

    但是,您将只能创建带有代码隐藏的 aspx 页面(您可以删除这些页面并在标记中输入正确的继承类)。要真正“转换”您的项目类型,以便获得 MVC 和 Visual Studio 的优点(添加新视图、转到控制器等),需要一些时间。我最好的建议是在 VS 2008 中创建一个新的 MVC 项目和一个新的 Web App 项目,并以纯文本形式比较 .csproj 文件。有一个长字符串值告诉VS项目模板。

    相信我,这确实有效。我以前在自己的遗留项目上做过。我不记得除了试验/错误/消除之外,我是如何找到项目类型“关键”的。 ASP.Net MVC 在与 webforms 相同的项目中表现不错。

    更新:我认为您可以通过在 .csproj 文件的 PropertyGroup 中使用这些来更改为 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 的道路。

    【讨论】:

    • 是的,理想情况下你是对的;您可能确实只想转换为 Web 应用程序项目。不过,我不想对现有的源码树产生太大的影响,而是想慢慢介绍一些 MVC 特性。
    • 更改 ProjectGuid 和 ProjectTypeGuid 属性对我有用 - 在开发时拥有额外的 MVC 特定上下文菜单(添加视图、转到视图等)真是太好了。谢谢!
    • 太棒了,我很高兴这对你有用。
    • 这不能回答问题。这个问题专门询问了关于做一个网站项目而不是一个网络应用程序的问题。我认为另一个答案与所提出的问题更相关。
    • 我已经想知道如何做到这一点好几个星期了......很好的答案。
    【解决方案3】:

    如果你想将 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)

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

        • 这很好用,但它不允许您右键单击“控制器”文件夹并添加新控制器或任何其他 MVC 上下文项。
        • 我收回了。该脚本没有卸载并重新加载我的项目,因为我当时正在编辑属性。如果您手动卸载并重新加载项目,上下文项将在那里!
        • 太棒了!感谢您提供更多信息。
        • 是否有针对此的 MVC 4 更新?
        • 我在其他地方没见过这个,这看起来非常有用 + 1
        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

              猜你喜欢
              • 2016-04-06
              • 2013-07-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-10-31
              • 1970-01-01
              • 2023-03-26
              相关资源
              最近更新 更多