【发布时间】:2012-03-24 12:49:03
【问题描述】:
我对使用 MVC3 构建交互式 GUI 的一般方法感兴趣。
这个想法是构建一组不同的组件,可以集成(插入)到各种场景中。
每个组件必须有它自己的模型定义、控制器和视图。 组件不仅封装了视图,还通过它的控制器封装了行为。
所有内部实现细节、模型、行为等...必须位于组件内部, 使组件变得独立,模块化 - 黑匣子。 这允许在不破坏使用组件的上下文中的任何内容的情况下更改组件。
组件运行的上下文不得对组件实现的内部细节做任何假设。
另一方面,组件不会对将使用它的上下文做出任何假设。
最后,组件必须提供与外界“通信”或“交互”的机制。除了内部,组件还必须提供某种“外部”接口(如参数、数据、函数、事件等等……),以便将组件集成到执行上下文中。
上下文(或场景)是包含组件的部分。 现在,上下文的基本挑战是管理组件之间的交互。
真实世界的类别组件示例:
组件显示类别列表并允许用户执行各种操作,例如排序、分页和记录选择。 在内部,它有自己的模型来存储当前页面、排序、选择等相关信息...... 在内部,它在自己的控制器中实现所有必需的操作(用于基本渲染、用户操作响应等)。 在内部,它在自己的控制器中处理视图中的模型状态持久性和模型状态恢复。
现实世界中的产品组件示例:
组件显示产品列表并允许用户执行各种操作,例如排序、分页和记录选择。 在内部,它有自己的模型来存储当前页面、排序、选择等相关信息...... 在内部,它在自己的控制器中实现所有必需的操作(用于基本渲染、用户操作响应等)。 在内部,它在自己的控制器中处理视图中的模型状态持久性和模型状态恢复。
真实世界的仪表板页面(上下文、场景)示例:
页面同时显示类别和产品组件。 Products 组件显示当前所选类别的所有产品,因此必须提供外部接口(参数或其他东西)以从上下文中接收所选类别标识符。 类别组件必须提供某种外部接口,以便上下文可以在所选类别发生变化时起作用,并为产品组件提供所选类别标识符。
从技术上讲,页面更新的通信方式主要通过 AJAX 进行,但如果没有 AJAX 也能做到这一点,那就更好了。
在 AJAX 的情况下,我想要解决方案,它使用服务器端控制器来决定和呈现应该在客户端更新的内容(JSON 或其他东西)。
我会不喜欢客户端脚本(客户端“喜欢”控制器)中的解决方案,该解决方案决定调用哪些操作以及更新页面的哪些部分 - 如上一段所述,必须决定通过服务器上的控制器。
重要提示:通过某种路由直接调用组件不一定能工作。
您通常如何实施所描述的系统?
【问题讨论】:
-
我在使用经典 ASP.Net Web 表单使用描述的类似组件构建复杂系统方面拥有丰富的经验。但是,我看不到如何在 MVC 中实现这种方法。 MVC 为您提供了极大的灵活性和显示的可重用性(html 渲染),但它完全忘记了行为 - 组件不仅仅是外观,它还包括组件的功能和允许您执行的操作(行为)。在 MVC 中,我知道如何重用视图(使其模块化),但我真的不知道如何实现可重用行为(现在,每当我使用组件时,我都会得到重复的代码)。
标签: asp.net-mvc asp.net-mvc-3 components modularity interaction