我正在构建一个类似于StackOverflow的网站,主要是作为一个学习练习,我很难理解如何决定MVC模式中的不同控制器。
控制器究竟是什么?您将使用哪些控制器来建模类似于SO的Q& A网站?我正在使用ASP.Net MVC,我注意到URL模式总是“/ Controller / Action” - 但这绝对不是我想要的最终URL看起来像(“/ Question / 123”不适合进入那种模式)。这是一个考虑因素吗?
我知道这实际上是几个问题的混合...也许我真正需要的是一个很好的教程来理解基础知识。
答案 0 :(得分:3)
简单来说,控制器是模型和视图之间的契约/桥梁。
以下是流程:
控制器用于主要请求处理逻辑。如果页面必须与数据库通信, 控制器向模型发送请求,模型使用db执行其任务并将一些响应或db记录返回给控制器,然后控制器将此响应发送给视图。
下图更容易解释过程:
答案 1 :(得分:2)
让我们把你的问题分成两部分:
我对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)
很多人认为这个讨论非常有用:
答案 4 :(得分:1)
MVC架构中的控制器负责向模型询问数据并向视图提供数据。拥有控制器的原因是为了保持模型和视图之间的分离。通常认为,oo系统中的部件之间的松散或无耦合是期望的和必要的。它支持可重用性和封装,因此可以提高可维护性。
在宁静的Web应用程序的上下文中使用MVC模式将支持a 控制器使用以下格式处理URL:
/控制器/动作/:ID
因此,要查看单个问题,您需要:/ questions / view / 123。可以找到关于设计一个宁静的网络应用程序(基于熟食店,li,cious)的精彩文章here。
答案 5 :(得分:1)
我看待它的方式是,任何你想要执行或需要控制器的动作。 因此,例如在Q / A网站中可能会出现类似......
如果我们使用以下实体和关系构建它
用户强>
<强>问题强>
<强>答案强>
然后我们可以让以下控制器处理对上述实体执行的操作。
您的控制器最有可能拥有比上述方法更多的方法。
下一位有点棘手,因为它不是你想要控制器的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简而言之:
优点: