我本来打算把它作为一个更长的问题,但我觉得我做得越短越好,你就越能理解我的意思。
MVC架构模式有3个依赖项。视图取决于模型。 Controller取决于视图和模型。该模型是独立的。
图层架构模式定义了N-1个依赖关系,其中N是图层数。
给定三个层:模型,视图和控制器,只有2个依赖项,而传统的MVC只有3个。结构如下所示:
View ---> Controller ---> Model
[视图取决于控制器,控制器取决于型号]
在我看来,这种风格实现了相同的目标和产生更松散的耦合。为什么这种风格不常见?它真的实现了同样的目标吗?
编辑:不是ASP.NET MVC,只是模式。
关于格里格斯的帖子:
答案 0 :(得分:15)
因为您将接口与控制器分离,使更改更容易。
还要考虑您需要开始一个项目的场景,但艺术品将不会在几周或几个月内准备就绪。您是等待还是编写页面所需的所有代码,然后将视图连接到控制器。
至少这就是我们所做的,我们节省了几个月。
此外,它使UI更改更容易应对,因为我们的aspx页面中没有任何代码可以执行任何操作。
我们的测试也更好,因为我们可以模拟任何内容,包括按钮点击等。
如果您正在谈论asp.net-mvc框架,那么aspx文件中没有代码,也没有viewstate等。
答案 1 :(得分:3)
在适当的MVC中,控制器不依赖于视图afaik。或者也许我没有正确理解它。
模型定义数据。
视图定义了输出的样子。
控制器是从模型理解语法到视图理解语法的翻译器。
所以基本上控制器是独立的。视图是独立的。模型是独立的。
是?否?
答案 2 :(得分:1)
我会大胆,并尝试解释为什么你的方法没有流行。
MVC模式基本上要求视图和模型层就API达成一致。 由于一个服务于另一个并且代码内部没有依赖关系,它使控制器一般地表现,它需要做的就是在视图层中采用某个结构并在模型层上调用匹配的API。
你会注意到,在视图和模型之间达成一致意见并不是一件非常重要的事情。而你得到的是后端前端开发之间的良好分离。
在您提出的解决方案中,控制器端需要进行大量的开发。控制器将需要了解视图中的所有元素,并将它们映射到模型层上所需的特定调用。 由于控制器是将许多视图连接到许多模型的单一访问点,因此很快就会失控并最终成为难以理解的控制器模块。
看看一些Struts2示例,看看我的意思......
答案 3 :(得分:1)
我想我理解你的观点:
是的,您只能通过将Controller转换(使用PHP作为示例)将Model对象转换为非Model对象(如简单数组),使View仅依赖于Controller。
正如我们已经知道的那样,如果实际上不需要去耦,那么执行这种转换可能比它的价值更大。如果View使用Model对象,则它具有此依赖关系。但是,通过让View完全依赖于Controller所需的输入(可以是Model对象),可以稍微减轻这一点。
Symfony PHP框架在Model和View之间提升了这种瘦调控制器的混乱方式。您仍然可以直接调用Model层来检索View层中的对象,但是强烈要求它反对您提出的耦合问题。在视图中,您可以调用include_component(),如果您需要查询模型,它实际上会返回到Controller。
答案 4 :(得分:1)
我很长一段时间没有回到这一点,主要是因为我还在思考。我对收到的答案不满意,但他们并没有真正回答我的问题。
最近,一位教授确实引导我朝着正确的方向前进。基本上,他告诉我这个:将模型,视图和控制器分开的图层是 MVC。在vanilla MVC架构模式中,View与模型之间的依赖关系通常不会被使用,并且您最终会使用Layers。这个想法是一样的,命名很差。
答案 5 :(得分:0)
在Microsoft平台上为新的或企业Web开发选择演示模式是一项艰巨的任务,在我看来只有三个; View Model,Model-View-Presenter(MVP)或ASP.NET MVC(Model2衍生物)。
您可以在此处阅读完整文章ASP.NET MVC Patterns
答案 6 :(得分:0)
我想补充一些东西。首先,对于我的观点,我们使用模型作为容器,以获取我们想要传递并显示在视图上的信息。通常,控制器中的动作方法以返回视图(“viewName”,model)结束。视图本身可能会改变其对模型的放置:
视图上的:
if(model.something == true){
%GT;
有些人要表现出来<%
}
在这个方面,很难找到模型的定义。
我可以说(特别是在企业文本上)是两个“模型”
一个是域模型/实体模型或者如何调用它来包装来自较低层(数据库等)的数据和包含我们想要显示的信息的视图模型以及我们的任何其他信息需要隐藏/显示界面部分
控制器编排视图并且与视图无关,但与模型有点相关:
进入控制器
pulic actionResult Index(){
...
如果(model.BoolProperty == TRUE){
return(“firstView”;
}
否则
{
return(“secondView”);
}
}
我希望它有意义
答案 7 :(得分:-1)
在我看来,你最好在你的程序中尝试它,你可以在rails上使用ruby,或者使用codeigniter(对于php),这些伟大的框架可能有助于你理解MVC。