我认为我们中的许多人过去常常面临同样的问题:将现有Web表单App移植到MVC的最佳做法是什么。对我来说,情况是我们同时支持Web表单和MVC。这意味着,我们在MVC中创建新功能,同时在Web表单中维护旧页面,并且它们都在同一个项目中。
重点是:我们希望保持DRY(不要重复自己)原则并尽可能减少重复代码。 ASPX页面不是问题,因为我们只在MVC中创建新功能,但仍然有一些共享组件我们想要重新使用新旧页面:
这里的问题是:是否可以创建可用于Web表单和MVC的公共母版页/用户控件?我知道 ViewMasterPage 继承自 MasterPage 和 ViewUserControl 继承自 UserControl ,因此可能确定让网页表单和MVC ASPX页面都参考MVC版本。我做了一些测试,发现它有时会在渲染用户控件时产生错误。
您可以与我分享任何想法/经验吗?非常感谢。
背景
这个UI项目已经创建多年,有20多人在研究它。在我开始共同的母版页面试用之前,大约有50多个Web表单页面和只有一个MVC页面。我们在MVC上创建了新功能,但旧页面保留在Web表单中。
这种情况将持续很长时间,可能是因为这是一家以业务为导向的公司,因此新功能始终处于更高优先级。这意味着我们需要同时支持两者。
答案 0 :(得分:6)
使用带有Web表单页面和用户控件的ASP.NET MVC母版页有几个集成问题。由于两个框架的执行管道不完全相同,因此遇到一些问题是正常的。
我遇到的一件事是网页表单使用单一界面模式(页面上有一个<form>
标记runat="server"
。在您的母版页或使用它的页面中,如果要使用服务器控件,则必须自己创建此标记。请注意,这将适用于只读控件。如果你需要回复&amp;事件处理您可能会遇到更多事件处理和事件验证问题。
另外一个技巧是创建将现有控件呈现为字符串的html助手。您可以查看更多信息http://www.abadjimarinov.net/blog/2009/10/29/HowToRenderAspdotNETControlToString.xhtml这也是一个部分解决方案,因为它不适用于大多数用户控件。
提供一些代码或错误消息会很有帮助,所以我可以给你更具体的答案。 在这个级别,我只能说两个框架是兼容的,你可以集成它们,但这不会轻松,需要对现有代码进行一些更改。
答案 1 :(得分:3)
这听起来很苛刻,但会让我更容易理解这个想法。夸张有时会有所帮助,因为它强调某些需要理解的事物。
确定。我们目前正在使用自行车从 A 到 B 。我们正在考虑购买汽车,但我们希望尽可能地从一个汽车过渡到另一个汽车。考虑一下我们增强我们的自行车这一事实,因此它使用自定义踏板等。我们可能会考虑使用这些踏板和其他增强功能吗?
基本上它是可能的。但是如果没有造成巨大的混乱,那绝对是不可取的。
建议过渡是逐个更改页面以使用新技术(当然是新技术中的新技术),而不是将某些MVC功能引入到webforms页面。用于特定用户进程的MVC或WebForms。大多数非UI代码可以重复使用(业务服务,数据访问层代码,适用时的数据/域模型)。但是,如果你在你的代码隐藏中填写所有代码......祝你好运。如果您没有分开代码,您或多或少会重复代码。不幸的是,这不是Asp.net MVC的错。没有SoC,这是你糟糕的设计。
如果您没有自杀,请不要混合/混合/混合两种UI技术。您可以使用自行车或汽车从A-> B出发,但不能同时使用两者。这意味着您可以将WebForms作为应用程序的一部分,并将MVC作为其中的一部分,但不可能在同一页面上。只有在使用 Web应用程序而非网站时,才有可能实现此目的。 Asp.net MVC 无法正常工作作为网站(按需部分编辑每页)。
自行车和汽车是两种UI技术。你做什么或从A-> B走路的目的并不重要。这是业务逻辑。如果您要提供与运输无关的报纸。因此,您可以看到其他图层可以重复使用。
Asp.net WebForms
服务器端控件(Web /用户)使用事件管道执行模型。因此,它们(除非完全呈现性质)具有某些代码订阅的服务器端事件。平台完全是状态满的,并且所有内容都以完全抽象HTTP的方式执行。一切看起来都像是在运行桌面应用程序。
控件通常封装表示,代码(如服务器端和客户端脚本)和样式(如CSS中)。这就是为什么使用WebForms让SoC变得更加困难的原因。
Asp.net MVC
此平台完全适用于HTTP协议的无状态特性。每个请求都是完全无状态的(除非您将某些状态数据存储在持久性介质中 - 会话,数据库等)。没有什么比事件模型更像了。它基本上只是能够将数据传输到服务器的数据/信息的表示(无论是GET,POST,DELETE,PUT ......)。服务器端没有任何事件。它只能读取数据并对其采取行动。并返回一些结果(HTML,脚本,JSON,...)。没有事件。没有国家。没有复杂的抽象。
Asp.net MVC摘录了一些与数据相关的常见场景。就像自动转换为复杂的对象实例和数据验证一样。其他一切都不见了。
使用WebForms的Asp.net MVC
如果您想在MVC应用程序中使用服务器端控件,您可以将它们放在ASPX / ASCX中,但它们只能用作纯粹的演示文稿。您将提供一些要呈现的数据。这就是它。回发甚至不起作用(除非你在其上放置一个提交按钮),因为没有__doPostback
客户端功能可以向服务器发出POST请求。因此,如果这些控件具有任何服务器端代码(即使它们没有启动回发)并且在加载后与它的状态完整生命周期相关,那么您可以告别它们。或多或少。
除此之外,您可以在互联网上read a lot about differences between Asp.net WebForms and Asp.net MVC。
答案 2 :(得分:2)
你可以在2之间进行一定程度的整合,但你最终会得到更复杂的东西。两种方法都不太令人满意。换言之,包括。
过去我曾遇到同样的问题。服务器端包括为我工作。我知道的老学校&amp;不是我一般推荐的东西。但我们不在理想的世界中工作。
答案 3 :(得分:2)
分享MasterPages :请参阅this thread。
用户控件:
这是我与MVC存在的祸根之一;在MVC2和之前的版本中,没有直接等同于webforms用户控件。一种解决方法是创建HtmlHelpers - (有效地扩展返回HTML的视图中可用的Html
对象的扩展方法),但这意味着您必须在代码中呈现HTML。哎呀。
使用MVC3和Razor视图引擎,可以使用一类新的Html Helpers,它提供了用户控件的大部分好处,包括将它们放在单独的程序集中的能力(因此可以在多个项目中使用)。我会看看我是否可以挖掘一个示例链接,但Scott Guthrie的博客在他最近的一篇MVC3 / Razor帖子中有一个例子。