题 我可以将ASP.NET MVC与常规ASP.NET Web表单一起使用


我应客户要求构建了一个包含ASP.NET Web表单的大型站点。问题是我发现ASP.NET Web表单有点不直观(仅限我个人品味)。所以我想要做的就是使用MVC,但我不能指望我的客户在完全重写时付出我的时间(也没有时间)。

所以我要问的是,我可以同时使用ASP.NET MVC和Web表单并逐渐使用MVC吗?有小费吗?


30
2018-02-12 15:12


起源




答案:


2014年更新:

Visual Studio 2013让我们更接近One ASP.NET。 没有MVC   不再是项目类型或Web窗体项目,只有ASP.NET。如果   你想混合Web Forms和Web API,或者MVC和SignalR,继续吧!   我们受到鼓励和支持。新特性和功能   在不破坏现有应用程序的情况下引入NuGet。

VS 13

因此,现在鼓励Web窗体和MVC(几乎已经无缝地工作)的混合,并且边界被混淆。我想MS认识到需要允许项目慢慢迁移到MVC,或者只是根据需要迁移部分,并获得两全其美。


MVC项目:

将MVC与Web表单一起使用已有一段时间,这当然是可能的,也是一个很好的选择。新的功能和页面可以很容易地添加到具有良好架构设计的MVC页面中,例如DDD(服务存储库,依赖注入等),旧的东西可以保持不变。在Webforms页面中组合MVC也可以正常工作,尽管JS验证可能存在一些小问题。我会极力推荐它。

它很容易从创建一个MVC应用程序(5个大气压)开始,然后在你获得基本模板并运行之后在文件夹中添加旧的webforms。这样您就可以正确获得新的MVC设置并保持向后兼容性。

  • 您可以创建一个MVC项目,只需将所有Webforms页面复制到例如一个文件夹。 (可能只是升级项目,我想)
  • 设置路由以忽略URL中具有该特定foldername的请求。这样,MVC和webforms可以在URL中一起使用而不会有麻烦。
  • Asp.net WebForms ASPX 页面可以驻留在MVC中,只要它们不放在/ Views文件夹中即可。
  • 使用Razor的旧语法,您可以轻松自定义HTML帮助程序,它更清洁。
  • 检查MVC标准和约定,控制器应该非常轻量级。代码隐藏不是可以包含所需逻辑的代码。
  • 视图不应包含多个表示逻辑(没有业务逻辑)
  • 一切都是新的=> MVC
  • 两者都可以使用资源,web.config等
  • 菜单不使用MVC中的旧站点地图

在webforms .aspx页面中使用MVC:

下面的文本旨在演示如何在webforms页面中使用MVC。 (例如,在MyPage.aspx中)你可以在webforms中使用MVC动作/视图,例如ajax填充页面的一部分或某些div。

包含MVC的Webforms工作正常,至少在HTML中添加ajax调用以填充MVC的div时。

在.aspx里面

..html & webforms code

<div id="fillMeFromMVC">
  <script type="text/javascript">
   $.ajax(... call an MVC action to fill 
      the "fillMeFromMVC" div that this script sits inside of);
 </script>
</div>

这将通过MVC填充页面的一部分,您可以干净地完成MVC,而无需担心在webforms中做了什么。

WebForms与MVC:

到目前为止,您可能已经非常清楚这两种技术之间的差异,但这里有一点比较。他们都有自己的目的和用途。我个人更喜欢MVC来完成我需要做的事情,但这可能取决于你想要达到的目标。

如果您使用例如在它们背后的SOA中,webforms和MVC页面都可以使用相同的业务逻辑。 当代码全部位于页面后面并且与UI关联时(不关注关注点),Webforms可能是有害的。虽然可以减少可靠的架构和一些努力。

进一步阅读:

Webforms与MVC(代码项目)

ASP.NET WebForms和ASP.NET MVC(博客)之间的区别


16
2017-12-13 08:49



我认为你错了,因为MVC RouteCollection 有这个设置叫 RouteExistingFiles 是的 false 默认。这意味着如果您访问现有的aspx页面(并且它不在 查看 文件夹(本地web.config阻止对文件的直接请求访问),它应该作为日常WebForm处理。 - Robert Koritnik
好的,我不完全确定这一点,我编辑了这篇文章。 - lko
@Iko:如果你确定,你可以测试一下,对吧? :)但我不是在谈论在MVC视图中嵌入Web窗体服务器控件...我说的是Web窗体页面可以驻留在MVC Web应用程序中。所以你明显误解了我的评论,因为你正在做的是将WebForms页面与部分Asp.net MVC视图混合在一起。这是OP所询问的另一件事。 - Robert Koritnik
@RobertKoritnik很高兴知道,所以你可以反过来(在MVC页面内的Webforms)。但他要求在同一个项目中使用它们。我可以假设在某些时候他可能想要更新页面的一部分,在这种情况下,只需删除webforms部分并用MVC替换它就很简单。假设有一些臃肿的复杂控制,他可以用MVC取代,这可以使用我建议的解决方案。他要求提示并且我之前已经完成了这项工作,我认为这可能是他可能遇到的情况(特别是当他注意到他的偏好是MVC时)。 - lko
将webforms放在MVC项目的文件夹中听起来像一个干净的解决方案,但我无法理解它如何在共享资产(如scrips,图像,字体等)方面起作用......此外,在您的解释中如何解释不清楚导航到webforms而不在URL中包含其包含的文件夹。你能不能解释一下? - Organic