服务器控件如何违反MVC设计模式?

5
我之所以问这个问题,是因为在我的另一个问题的答案中,tvanfosson(第一个)评论他的回答时说(关于ASP.NET MVC):“缺乏服务器端控件是由于MVC固有的关注点分离使其成为一个好的开发模式。”
我当然知道ASP.NET服务器控件,而且我认为我知道MVC设计模式,但我不明白服务器控件如何违反MVC。

谢谢。

2个回答

1

我认为这与postback + viewstate + events模型有很大关系。

上述隐式发生以模拟用户以多步方式与应用程序交互的模型,其中系统存在各种状态。由于每个控件都持有其viewState,因此每个控件本质上都对此整体状态做出了贡献,随着页面复杂度的增加,这可能变得难以跟踪。我还相信方便性鼓励了这种复杂性。

上述可能更多地是支持restful的论点,它促进了更多地依赖协议的处理方式。使用post来实现上述功能,确实不是HTTP协议的意图。只需考虑asp.net网格的原始内置分页,因为它基于postbacks,搜索引擎忽略了第一页之外的任何内容。此外,您再也无法通过url访问该信息页面。

在asp.net MVC的上下文中,imho MVC模式更多地涉及简单的请求/响应操作。您可以使其变得像您需要的那样复杂,但它促进了一种更简单的操作方式。它不是基于与经典方式中页面/视图上散布的几个不同信息相关的状态进行工作;但是,如果这是您所需的,您仍然可以实现它,但在这样做时必须更加明确。


在我看来,你所描述的是服务器控件缺乏无状态性和简单性,我不认为这些与MVC相矛盾。 - Oren A
@Oren 考虑将 MVP(模型视图控制器)引入其中。 MVP 与 MVC 的一个重要区别是状态处理,因为 MVP 使用基于用户操作更改的视图,因此无论您在哪里放置状态,视图都不是仅显示一次的东西。在 MVC 中,每个操作显示不同的视图(是的,您可以显示相同的文件/视图,但从概念上讲),下一个操作与前一个操作无关。在 asp.net classic+server 控件中,常见的情况是显示相同的内容,但在该控件中显示这些数据/或隐藏它们。 - eglasius
请注意,@tvanfosson可能对视图的职责和控制器的职责有所了解,因此他可能会根据视图上应该(不应该)有什么来提供更直接的解释。对我来说,通过MVP比较更清晰,因为你可以在其中拥有一个结构良好的经典asp.net应用程序,但仍然揭示了与MVC的重要区别。我认为MVC的方式更符合HTTP的本质。附注:请注意,asp.net MVC使用MVC的变体,还有其他变体。 - eglasius

0

在《Pro ASP.NET MVC 2 Framework》一书中,Steven Sanderson(第5页)提供了答案:

“......实际上,开发人员被鼓励将表示层代码(例如,操作服务器控件树)与应用程序逻辑(例如,操作数据库数据)混合在同一个庞大的代码后台类中。
如果没有更好的关注点分离,最终结果往往是脆弱且难以理解的。”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接