49

是否可以创建一个 MVC 根应用程序(带有母版页和主题的门户)并添加几个基于 WebForms 的子项目(我们已经有一个想要集成到门户中的现有 WebForms 应用程序)?

您将如何集中导航(站点地图、网址路由)?
您将如何共享母版页?
您将如何引用资源(〜问题等)?

4

4 回答 4

48

将 Web 表单与 MVC 相结合是完全可能的。有关介绍,请参阅Scott Hanselman的这篇博文。

于 2010-02-04T21:43:35.653 回答
32

作为参考,我昨天设法完成了这项任务 - 将 MVC 功能添加到现有的 WebForms 网站,也就是说 - 所以我想我会写,以防它对任何人有任何用处。

人们说:“最好的方法是将您的 Web 表单应用程序重写为 MVC”,但是当应用程序已经很好地建立并且随着时间的推移已经成长为一个相当大的怪物时,通常没有商业案例(我可能会添加它仍然很好用) )。在我的例子中,我们被要求在这个应用程序中实现一个新功能——并且最近在其他项目中使用 MVC 进行开发——我想在 MVC 中构建这个新功能。这就是我所做的:

  1. 创建一个新的ASP.NET MVC 4 应用程序并选择Empty Template (with Razor)

  2. 加载后,右键单击References > Browse,然后导航到我现有网站的Bin文件夹。然后我添加了我在现有站点中使用的 DLL。作为参考,我正在使用 AjaxControlToolkit,因此决定添加来自 NuGet 的最新版本。这应该会自动更新 web.config 文件

  3. 然后我打开Windows 资源管理器并导航到我现有网站的根文件夹。然后,我使用 Visual Studio 复制了现有站点的顶级文件夹结构(减去 Bin 文件夹),导致 2 个站点具有相同的顶级文件夹(但新项目具有 MVC App_Start、Controllers、Models 和 Views文件夹,但显然不是 Bin)。

  4. 设置完成后,我从Windows 资源管理器的相应顶级文件夹中复制了子文件夹和文件,并将它们粘贴到解决方案中。如果您这样做,该项目允许您直接复制子文件夹和内容,通过 Visual Studio 添加现有项目仅复制文件,从而节省时间。请注意:对于根文件夹,我没有web.configGlobal.asax复制,而是在所有其他文件中复制(如 default.aspx 等)

  5. 复制完所有内容后,我在新项目中打开了 web.config,在现有站点中打开了 web.config。我将特定于现有网站的任何内容(appSettings、connectionStrings、命名空间、会员信息等)复制到新的 web.config 中。这同样适用于 Global.asax 文件。

  6. 我尝试构建并修复了我错过的任何内容。

  7. 一旦一切正常(并且我击落了几个黄屏死机),我注意到加载default.aspx时出现页面未找到错误。这取决于路由,这是我对路由信息所做的更改(位于 Global.ascx MVC 3 或 App_Start > RouteConfig.cs MVC 4):

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
        // This informs MVC Routing Engine to send any requests for .aspx page to the WebForms engine
        routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");
        routes.IgnoreRoute("{resource}.aspx");
    
        // Important change here: removed 'controller = "Home"' from defaults. This is the key for loading
        // root default page. With default setting removed '/' is NOT matched, so default.aspx will load instead
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { action = "Index", id = UrlParameter.Optional }
        );
    }
    

完成所有这些步骤后,站点像往常一样加载并运行,但我现在拥有了 ASP.NET WebForms 和 MVC 混合体。我确信可能有更简单的方法可以完成这项任务,但我尝试了其他方法并失败了。这种方式花了我大约 20 分钟,然后我就开始跑步了……坐得很好,编码:)

于 2014-05-01T09:36:37.363 回答
5

上面的答案很好。您可以考虑的另一件事是从 ASP.NET 迁移到 ASP.NET MVC,在这种情况下,这篇文章可能会帮助您迁移项目文件。

于 2010-02-04T23:21:06.343 回答
0

我太困在这种情况下,毕竟我得到了一个有效的解决方案,首先复制web.config到你的视图文件夹中。

在打开的Route.config(Routeconfig)文件之后,您将找到一个方法RegisterRoutes,保持原样并创建另一个名为 的方法RegisterRoutes2(),然后从 mvc 应用程序中复制粘贴以下方法代码:

public static void RegisterRoutes2(RouteCollection routes)
{...}

在某些情况下,mvc 应用程序中的方法名称是 RegisterRoutes。如果上面的代码不起作用,请从您机器的 mvc 应用程序中复制粘贴它。然后,去global.asax文件,然后你会发现RegisterRoutes()已经调用了,简单吧,也调用了RegisterRoutes2()。你完成了,重新启动你的应用程序,或者清理构建,它会运行。

于 2016-12-21T18:22:34.707 回答