了解MVC中的控制器

时间:2010-01-01 19:23:29

标签: asp.net-mvc

我正在构建一个类似于StackOverflow的网站,主要是作为一个学习练习,我很难理解如何决定MVC模式中的不同控制器。

控制器究竟是什么?您将使用哪些控制器来建模类似于SO的Q& A网站?我正在使用ASP.Net MVC,我注意到URL模式总是“/ Controller / Action” - 但这绝对不是我想要的最终URL看起来像(“/ Question / 123”不适合进入那种模式)。这是一个考虑因素吗?

我知道这实际上是几个问题的混合...也许我真正需要的是一个很好的教程来理解基础知识。

7 个答案:

答案 0 :(得分:3)

简单来说,控制器是模型和视图之间的契约/桥梁。

以下是流程:

控制器用于主要请求处理逻辑。如果页面必须与数据库通信, 控制器向模型发送请求,模型使用db执行其任务并将一些响应或db记录返回给控制器,然后控制器将此响应发送给视图。

下图更容易解释过程:

alt text http://www.shopno-dinga.com/dustbin/mvc.png

答案 1 :(得分:2)

让我们把你的问题分成两部分:

  1. Controller在Monorail和ASP.NET MVC提供的MVC风格中扮演什么角色?
  2. 网址映射与应用操作的关系如何?
  3. 我对1:

    的看法

    由于这类问题适用于许多宗教上的答案,我认为这不是“统治所有人的一种方式”。 现在在Monorail和ASP.NET MVC(当然还有RoR)中,Controller只是Actions的集合。 那么正确的问题是“行动的作用是什么”?

    在我的书(不成文的单轨行动书...... :)中,Action的作用是将域模型与表示分开,无论是在数据结构方面还是在关注方面。专门针对与域的接口是通过WEB请求这一事实的一切是控制器的层责任。这包括数据绑定和转换,处理身份验证(但授权),以及为视图模板做出决策。 因此,一个操作将从传入请求中获取参数(一个Web 一个域关注点),将这些参数绑定到一个有意义的数据,该数据可以作为查询或命令发送到域,在域的语言,没有cookie,FORM,QueryString和其他“web东西”。 在查看数据时,它还会将从模型返回的域对象转换为视图模型,在前面提到的同一本书中,该模型是与域模型分离的模型,并负责提供视图 - 模板包含所有数据及其所需的决策。因此,对于例如,视图不应该询问if (view.User.IsAdmin)并呈现“编辑”按钮,而是控制器的操作将提出此问题,并为视图提供决策,以便视图询问{{ 1}}

    因此,Controllers层将WEB问题与DOMAIN问题分开。

    至于问题编号。 2:

    将URL映射为Controller / Action的想法仅仅是采用“Convention over Configuration”方法的结果。这意味着,开发人员(和消费者)可以更轻松地使用在不同Web应用程序中通用的模式。 话虽如此,它并非一成不变,与任何公约一样,它是适应的基础。因此,如果您正在构建网站并且产品经理要求“漂亮的网址”,那么您只需相应地设置路由引擎。

答案 2 :(得分:1)

据我所知,这主要是偏好。我曾经问过同样的问题,但发现控制器只是将视图和模型结合在一起,以有序的方式呈现信息。

我认为你可以有一个问题控制器,有查看,编辑,创建等方法。这似乎是有意义的,特别是对于项目 - 一个Q& A网站。

答案 3 :(得分:1)

很多人认为这个讨论非常有用:

What goes into the “Controller” in “MVC”?

答案 4 :(得分:1)

MVC架构中的控制器负责向模型询问数据并向视图提供数据。拥有控制器的原因是为了保持模型和视图之间的分离。通常认为,oo系统中的部件之间的松散或无耦合是期望的和必要的。它支持可重用性和封装,因此可以提高可维护性。

在宁静的Web应用程序的上下文中使用MVC模式将支持a 控制器使用以下格式处理URL:

/控制器/动作/:ID

因此,要查看单个问题,您需要:/ questions / view / 123。可以找到关于设计一个宁静的网络应用程序(基于熟食店,li,cious)的精彩文章here

答案 5 :(得分:1)

我看待它的方式是,任何你想要执行或需要控制器的动作。 因此,例如在Q / A网站中可能会出现类似......

如果我们使用以下实体和关系构建它

用户

  • 有很多问题
  • 有很多答案

<强>问题

  • 属于用户
  • 有很多答案

<强>答案

  • 属于用户
  • Belogns to question

然后我们可以让以下控制器处理对上述实体执行的操作。

  • UsersController - 处理创建更新和删除用户
  • QuestionsController - 处理创建更新和删除 问题
  • AnswersController - 处理创建更新和删除 答案

您的控制器最有可能拥有比上述方法更多的方法。

下一位有点棘手,因为它不是你想要控制器的JUST模型(以及你不想要控制器的某些型号)。如果您将要有用户登录,那么我将创建一个会话控制器来处理登录和退出。

尝试考虑系统将被组成的实体并将其写下来。然后,考虑一下你将在哪些方面采取行动。然后你可以考虑所需的额外控制器,例如会话控制器。

进一步说明,模型基本上是系统的对象/实体,控制器使用这些实体执行操作,而视图则显示模型。

答案 6 :(得分:0)

控制器形成系统边界,即应用程序的http接口。它接受请求,触发请求处理并将结果返回给客户端。

您可以将属于某类域对象的所有操作放入单个控制器中。这将导致提到的URL模式/ $ controller / $ action。我建议使用REST。使用REST,您可以在“资源”而不是“控制器”和“操作”中进行思考。每个资源都有一组通用的方法,即DELETE,GET,POST和PUT。这些方法是HTTP动词。使用非REST方法,您将拥有比控制器更多的资源,但操作的总数将是相同的。

在您的示例中,一个资源将是“问题”,这将是所有问题的列表。要创建新问题,客户端会发送一个http请求,例如“POST / questions $ formdata”。将创建一个新的问题对象并将其添加到列表中。客户端将重定向到新创建的问题“redirect / questions / 4128”,然后使用“GET / question / 4128”加载它。

REST简而言之:

  • 每个资源都有一个全局ID(URL)
  • 每个资源都有一组通用的方法(DELETE,GET,POST,PUT)
  • REST应用程序是无状态的(请求之间没有会话状态)

优点:

  • 简单
  • 统一;易于理解的新开发人员,易于客户端开发人员使用
  • 可用于多个客户端,如浏览器,Feed聚合器,Web服务......
  • REST使用http的全部功能,无需开销(与SOAP Web服务相比)