Model view controller 如何使用MVC在同一页面上显示多个小部件

Model view controller 如何使用MVC在同一页面上显示多个小部件,model-view-controller,Model View Controller,我对MVC的工作原理有点困惑,除了一些基本的例子,我什么都找不到 我想做一种基于widget的设计;您可以在页面上选择各种小部件。每个小部件都应该对自己负责——它应该有一个控制器和一个视图。但是主页呢?突然我有了一个页面,上面有很多控制器 显然,要做的事情是以某种方式将控制器嵌入视图中这是我的小部件{SomeWidget}但我读到“打破了MVC范式” 一些小部件将需要发布到不同的URL(如搜索框进入结果页面),一些小部件将需要发布回相同的URL(如向文章添加注释将使您返回到文章) 最重要的是,用

我对MVC的工作原理有点困惑,除了一些基本的例子,我什么都找不到

我想做一种基于widget的设计;您可以在页面上选择各种小部件。每个小部件都应该对自己负责——它应该有一个控制器和一个视图。但是主页呢?突然我有了一个页面,上面有很多控制器

显然,要做的事情是以某种方式将控制器嵌入视图中<代码>这是我的小部件{SomeWidget}但我读到“打破了MVC范式”

一些小部件将需要发布到不同的URL(如搜索框进入结果页面),一些小部件将需要发布回相同的URL(如向文章添加注释将使您返回到文章)


最重要的是,用户应该能够编辑小部件周围的HTML-例如,如果他们想在右边有一个搜索框,他们可以键入
{SearchController}
(在我打破范式的世界中)

我不太擅长web编程,但我相信,从您描述的示例来看,应该有一个模型,整个页面有一个视图和一个控制器。现在,视图本身应该包含页面中每个小部件的视图(页面控制器也是如此),它将接收到的消息发送给这些小部件

从概念上讲,有一个较低级别的MVC(用于小部件)和一个较高级别的MVC(用于页面)。MVC范式不会被打破。现在您可以编辑小部件周围的HTML,它会更改页面模型(而不是任何小部件模型)


希望这有帮助

要在@Benoît的评论中添加:

Symfony框架通过组件处理此问题。每个组件都是一个自包含的MVC实例,可以嵌入到另一个视图中。它不能像普通MVC实例(模块/动作对)那样被实例化以直接响应web请求。它只能嵌入到另一个MVC视图中

附带说明:Symfony还将插件视为自己完整的MVC实例,包括自己的模式、模型、控制器、配置文件、视图等

在您的例子中,每个组件都是自己的MVC实例,应用程序会将这些组件缝合在一起。每个组件将负责如何响应表单提交


MVC并不意味着只有一个视图和一个控制器。这仅仅意味着应用程序逻辑存储在模型中,控制器将东西粘在一起,视图构建显示。这是一个逻辑和演示的正式和逻辑分离。

在MVC主题有很多变化,并且在对你的特定系统的设计做出结论之前要考虑很多。大多数最新的、流行的基于web的系统都将其视为指导原则。通常,某种框架组件是控制器,它使用某种配置调用适当的模板作为视图,并将其与适当的对象层次结构作为模型耦合。这些系统中的大多数都包含一个可扩展的GUI小部件库,供模板使用。您可以添加自己的小部件,但将小部件硬编码到特定的对象层次结构并不是最佳做法。IoC链接还讨论了组件和服务,这些组件和服务应该为您提供一些避免硬编码的指导。

我找到的关于MVC的最好、简短和简单的书籍之一是上周在PDC 2008世博会上分发的:

它不仅涵盖了MVC的概念,还涉及了它与其他概念(如RubyonRails和MVP方法)的比较

此外,通过描述MVC的关注点分离,以及为什么MVC不仅应该在UI级别,而且应该深入到业务对象和DAL的实际层或IoC结构,从而深入了解MVC存在的全部原因

我强烈推荐这本书,因为他只写了110页左右的最佳实践


不,我不为FirstPress工作,也不与他们有任何关系。我只是喜欢这本书,最后是我同意的人

ASP.NET MVC非常适合小部件仪表板mashup类型页面

看一看PDC 2008中的课程

您可能希望使用Ajax助手来更新每个小部件中的数据孤岛。下面是一个片段,说明如何在任何页面上放置计算器,但保持代码独立

查看片段:

<script type="text/javascript">
    function OnFailure(error) {
        alert("We have encounterd an error " + error);
    }
</script>
<% using (Ajax.BeginForm("Add", new AjaxOptions{UpdateTargetId="sum", OnFailure="OnFailure"})){ %>
    <%= Html.TextBox("x") %>&nbsp;+&nbsp;
    <%= Html.TextBox("y") %>&nbsp;=&nbsp;
    <span id="sum">?</span>
    <input type="submit" value="AddEm" />
<% } %>
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Add(string x, string y)
{
    int sum = int.Parse(x) + int.Parse(y);       
    return Content(sum.ToString());
}

关于在ASP.NETMVC中使用小部件,我发现最好的信息是在SteveSanderson的博客上。他解释了部分请求的概念,这是一种与子控制器不同的技术

部分请求很容易您听说过部分视图,那么 部分请求?在任何MVC中 请求时,可以设置集合 内部部分请求的每个 它可以建立自己的内部 部分请求等等。每个 部分请求呈现一个普通的旧请求 动作方法在你的任何一个平面 常规控制器,每个控制器都可以 生成一个独立的小部件。我是 称他们为部分“请求”,而不是 而不是“控制器”,因为它们运行 正确的MVC请求处理管道 这与您的路由兼容 系统和您的控制器工厂。 不过,与分包商一样,所有 控制权保留在控制器中,并且 这种观点可能是无知的


我认为JarrettV和jcoby的答案最接近


我逐渐认识到分包商是分层MCV(HMVC)。其思想是从父视图模板“拉”出内容(由子滚轴填充的视图),而不是从控制器将数据“推”到模板。因此,不需要编辑控制器和视图来添加小部件,只需从视图调用小部件即可。php框架CodeIgniter(模块化扩展)和Kohana(分派和组件)中都有实现这一点的库

必须将代码添加到模板和c