10

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

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

显而易见的事情是以某种方式将控制器嵌入到视图中......This is my widget {SomeWidget}但我读过“打破了 MVC 范式”。

有些小部件需要 POST 到不同的 url(比如搜索框转到结果页面),有些需要 POST 回相同的 URL(比如在文章中添加评论将您带回文章)。

最重要的是,用户应该能够编辑小部件周围的 HTML - 例如,如果他们想要右侧的搜索框,他们可以输入<div style="float: right;">{SearchController}</div>(在我的打破范式的世界中)

4

7 回答 7

2

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

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

希望这可以帮助 !

于 2008-11-03T17:56:12.000 回答
2

要添加到@Benoît 的评论:

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

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

在您的情况下,每个组件都是它自己的 MVC 实例,应用程序会将这些组件拼接在一起。每个组件都将负责它如何响应表单提交。

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

于 2008-11-03T18:13:20.937 回答
1

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

http://www.apress.com/book/view/1430216468

它不仅涵盖了 MVC 的概念,还涵盖了它与其他概念的比较,例如 Ruby on Rails 和 MVP 方法。

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

我强烈推荐这本书,因为他仅在 110 页左右就涵盖了最佳实践。

不,我根本不为 FirstPress 工作或与他们有关。我只是喜欢这本书,终于有人同意了。

于 2008-11-03T19:38:54.227 回答
1

我发现的关于在 ASP.NET MVC 中做小部件的最佳信息是在 Steve Sanderson 的博客上。他解释了他的部分请求的概念,这是一种与子控制器不同的技术。

http://blog.codeville.net/2008/10/14/partial-requests-in-aspnet-mvc/

部分请求很容易你听说过部分视图,那么部分请求呢?在任何 MVC 请求中,您都可以设置内部部分请求的集合,每个请求都可以设置自己的内部部分请求等。每个部分请求都会在您的任何普通常规控制器中呈现一个普通的旧操作方法,并且每个请求都可以生成一个独立的小部件。我称它们为部分“请求”而不是“控制器”,因为它们运行适当的 MVC 请求处理管道,该管道与您的路由系统和控制器工厂兼容。尽管如此,与子控制器一样,所有控制都保留在控制器中,并且视图可能是无知的。

于 2009-02-19T02:58:48.493 回答
0

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

看看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());
}
于 2008-11-06T05:57:15.460 回答
0

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

我已经将子控制器称为 Hierarchical MCV ( HMVC )。这个想法是您从父视图模板“拉”内容(由子控制器填充的视图),而不是从控制器“推送”数据到模板。因此,您无需同时编辑控制器和视图来添加小部件,只需从视图中调用小部件即可。在 php 框架 CodeIgniter(模块化扩展)和 Kohana(调度和组件)中有库可以完成此任务。

于 2009-02-19T03:21:19.220 回答
0

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

于 2008-11-03T18:14:03.120 回答