这个问题有点夸夸其谈。在某些时候,我感觉ASP.NET MVC不是MVC模式的真实实现。或者我不明白。
考虑以下域:电动灯泡,开关和运动检测器。它们连接在一起,当您进入房间时,运动探测器开启灯泡。如果我想将它们表示为MVC:
Switch有一个私有字段(On / Off)作为State和两个方法(PressOn,PressOff)。如果您在PressOn关闭时调用PressOn,它将变为On,如果再次调用它,则状态不会改变。
灯泡可以用蜂鸣器,带定时器或按钮的运动探测器替换,但模型仍然代表相同的逻辑。最终系统会有相同的行为。
这就是我理解经典MVC分解的方法,如果我错了,请纠正我。
现在让我们以ASP.Net MVC方式分解它。
因此定义行为的逻辑移动到控制器。
问题1:我对MVC和ASP.NET MVC的理解是否正确?
问题2:如果是,您是否同意ASP.NET MVC不是100%准确的实现?
恢复生机。最后一个问题是如何在ASP.NET MVC的情况下将模型与控制器分开。可能有两个极端。控制器做基本的东西,并调用模型来做所有的逻辑。另一个是控制器,所有的逻辑和模型都是类似于具有映射到DB的属性的类。
问题3:我应该在这两个极端之间划清界线?如何平衡?
谢谢, 安德烈
答案 0 :(得分:2)
我认为这可能是两种方式。这将是一个实现是ASP.NET MVC,它保留了你在第一个例子中的逻辑。
模型(存储库)
Function switchOn() as bulb
if !bulb.lightOn then
bulb.lightOn = true
end if
return bulb
End Function
Function switchOff() as bulb
if bulb.lightOn then
bulb.lightOn = false
end if
return bulb
End Function
Function Motion(senseMotion as boolean) as bulb
if(senseMotion and !bulb.lightOn) then
bulb.lightOn = true
end if
return bulb
End Function
<强>控制器强>
Function PressSwitchOn() as actionresult
return view("Bulb", lightRepository.switchOn)
End Function
Function PressSwitchOff() as actionresult
return view("Bulb", lightRepository.switchOff)
End Function
Function SomethingMoved(byval hasMoved as boolean) as actionresult
return view("Bulb", lightRepository.Motion(hasMoved))
End Function
我的控制器中没有业务逻辑,只是将状态从模型传递到视图。我是你的榜样吗?
回答问题。
答案 1 :(得分:1)
在您的示例中,运动检测器仍然必须调用SwitchOn和SwitchOff,这与在存储库上调用相同方法的控制器基本相同。因此,如果您考虑实现存储库模式的ASP.NET MVC应用程序,那么您的论点就会失败。
结论:
答案 2 :(得分:0)
在MVC框架中 - 请求总是FIRST来到Controller;然后只使用视图
创建和渲染模型在您的情况下请求转到Switch(这是您所说的模型),因此您无法以所述方式分解开关灯泡运动场景。