将MVC添加到ASP.NET网站

12

我想给一个现有的网站项目(不是Web应用程序项目)添加MVC支持,并有一些问题。

  1. 为了获取Visual Studio的MVC功能,似乎需要更新.csproj文件的<ProjectTypeGuids>节点。但网站项目中没有csproj文件。
  2. 看起来需要在App_Code文件夹中创建ModelsControllers文件夹。这是真的吗?我更喜欢将这些文件夹放在根目录下。
  3. 对于Views,我是否应该创建aspxaspx.cs文件?这种设置是否支持cshtml Razor文件?

如有其他回复,将不胜感激。谢谢。


5
据我所知,您需要转向使用Web应用程序。 - SLaks
@SLaks - 我的理解是转换为Web应用程序是一种更清晰的方式,但并非必需。 - Nick
6个回答

9
使用asp.net MVC2及以上版本,MVC团队将核心功能分为三个不同的程序集,每个程序集都扩展自公共的System.Web程序集:
  • System.Web.Routing
  • System.Web.Abstractions
  • System.Web.Mvc
通过这种分离,他们使程序集能够在“中等信任服务器环境中工作并且可以进行bin部署”。
其中一个好处是,您不必拥有特定的项目类型来运行MVC。您只需要这些程序集、一些目录和调整过的web.config文件。
要做到这一点,您只需要将程序集放置在项目的本地bin文件夹中,并为这些程序集进行必要的引用。完成后,您就可以访问asp.net MVC了。
以下是Wrox Professional ASP.NET MVC 1.0书籍中的详细说明,应该可以帮助您入门: 将MVC包含在现有Web表单应用程序中

将ASP.NET MVC功能添加到现有的Web Forms应用程序中,包括三个不同的步骤:

1. 添加对ASP.NET MVC所需的三个核心库的引用:System.Web.Mvc、System.Web.Routing和System.Web.Abstractions。

2. 向应用程序添加两个目录:Controllers和Views。

3. 更新Web.config以在运行时加载三个程序集,并注册UrlRoutingModule HttpModule。

供参考,以下是一些具有更详细场景的博客/网站,可能会对您有所帮助:

混合使用ASP.NET Webforms和ASP.NET MVC

ASP.NET WebForms和ASP.NET MVC的和谐共存

祝您好运,并希望这些对您有所帮助。


我已经将MVC添加到项目中,没有任何问题。然而,我的问题是关于如何让Visual Studio支持这个混合项目。在Web应用程序项目中,可以通过修改csproj文件来实现,但我还没有找出如何在网站项目中使其工作。我之前还有其他问题需要解决。 - Nick
Razor应该可以正常工作,但是为了保持所有东西看起来都一样,因为你已经在使用.aspx文件,我建议继续使用Webform视图引擎来保留MVC视图。这可能更多地取决于你的选择。对于使用App_Code目录,如果你正在使用纯网站,那么你可能确实需要将模型和控制器放在其中。如果你已经转换成Web应用程序,那么所有内容都会编译成一个单独的DLL,所以这些文件夹放在哪里并不重要。 - Chris
由于控制器文件夹需要在“App_Code”中,是否有一种方法可以添加类库和引用到网站项目中?如果可能的话,我想避免在“App_Code”文件夹中添加任何内容。另外,您有什么想法如何集成使用“Areas”? - Nick
由于使用MVC时只需调用方法而不是页面,因此拥有一个类库应该可以正常工作。现在我不确定的是项目的规模以及您试图将代码库带到何处。随口说一句,如果您现在可以使用MVC,则应该也能够添加区域,但我没有相关参考资料提供给您。 - Chris
这是一个相当大的项目(数千页,数百个项目)。我认为添加区域的问题在于区域需要自己的 web.configAreaRegistration 类文件。由于我将其分离到不同的类库中,它不喜欢 web.config。此外,使用单独的类库,我必须像在控制器中那样引用 Session 对象。我的理解是我们不应该在类库中使用 HttpContext,这不是一个好的实践。你有什么想法? - Nick

8

我已经成功地将一个ASP.NET MVC 3添加到Webforms项目中,以下是一些建议:

  • Controllers作为一个单独的类库项目添加,并从Webforms Web项目中添加对此项目的引用。
  • 我试图获得VS MVC支持(如转到控制器等),但在.csproj文件中添加GUID {E53F8FEA-EAE0-44A6-8774-FFD645390401}没有帮助。
  • 是的,您可以添加引用以从您的类库中获取Session。如果您想编写单元测试,您始终可以模拟它。
  • Views文件夹添加到根目录下。
  • App_Code中添加Models
  • 如果您正在使用Razor,则需要添加System.Web.RazorSystem.Web.WebPages引用。
  • 如果您正在使用Razor,请按照此post更新Web.config
  • 请记住,只要不使用postbacks,就可以向视图添加服务器控件(我有许多来自我的Webforms项目的服务器控件需要使用)。

请注意使用虚拟路径。在我的网站上,当我尝试添加MVC时,它没有按照步骤工作,只是因为我在虚拟路径中使用了'.'(例如:"project.web")。 - hopper

1

我相信如果您建立一个新的MVC项目并将您的Web表单复制到新项目中,它们将按预期呈现。

我之前出于好奇尝试过这种方法,Web表单仍然可以正常呈现,但我没有进行太多实验。我想这取决于您的项目复杂程度,这种方法是否可行。

这将涉及更改您的项目类型。


现有的项目确实非常复杂。我可以将MVC项目添加到其中,但除非我真的真的需要,否则会避免创建一个新的MVC项目并将Webforms项目复制到其中。如果我最终朝着那个方向走,您是否有可以帮助我的资源? - Nick

0

我之前见过这种方法在网站根目录下放置Global.asax文件可行。您需要一种方式让您的项目能够识别和区分MVC请求和标准请求,例如:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapRoute("Default",
        "{controller}.mvc/{action}/{id}",
        new { controller = "Home", action = "Index", id = "" }
    );
}

因此,在您的应用程序中,MVC URL 可能如下所示:http://www.mywebsite.com/mycontroller.mvc/View/5


是的,这是可能的。然而,我很好奇是否可以在网站项目中获得VS MVC的好处(以及之前概述的其他问题)。 - Nick
你不必区分mvc和webform请求。路由将自动确定要显示哪一个。如果URL冲突,则可能需要更改一些内容以使其正常工作。 - Simon Halsey

0
我被分配更新(但不幸的是没有重写)一个遗留的.Net 3.5,VB.NET(呃)Webforms,网站项目,我成功地升级到了4.0并添加了MVC3支持(使用单独的代码编译文件夹来支持C#,耶!),它工作得很好。
@DotnetDude的说明确实有效,但要注意几点...
(1)当添加Razor支持时,这是在Views / Web.config文件中完成的,而不是在项目根目录中的web.config文件中。
(2)如果您确实在Views目录之外添加了Razor文件(.chtml或.vbhtml),vs.net将使用以下值更新您的根web.config
<appSettings>
  <add key="webpages:Enabled" value="true" />
</appSettings>

不好。这个设置是允许直接浏览 Razor 页面的,但在我的情况下,将其设置为 TRUE 会导致一切都崩溃。话虽如此,我只在我的 Views 子文件夹中使用 Razor 页面,但我发现可以从我的 .aspx 页面向在 App_Code 目录中定义的控制器发出 AJAX 调用,从而使我能够现代化一个大部分都是 postbacks 和 C# 访问 VB.NET 编写的数据层的应用程序。


-1

ASP.NET MVC不支持网站模板,只能是Web应用程序。因此,您无法将MVC功能添加到Web Forms项目中。


4
不对,你可以将MVC添加到Web Forms项目中。虽然VS工具可能不起作用,但是如果按照@chris提供的简单步骤进行,MVC仍将正常工作。 - Simon Halsey

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