【发布时间】:2011-03-28 04:26:37
【问题描述】:
我必须在我的 MVC 应用程序中构建一些 ascx 部分视图来封装可重用的功能以及存档 SOR 和 SOC。然而,我遇到了如何封装驱动 MVC ascx 视图的业务逻辑的挑战。
在 Web 表单中,ASCX 控件背后的代码可以处理按钮单击事件,并且浏览器仍然显示相同的页面,并且只有一个回发。如何在 MVC 中归档相同的内容?当 ~/Address/Edit/2 包含一个 ascx 部分视图,上面有一个调用另一个 MVC 操作的按钮 - 比如说 ~/ShareController/CommonAction - CommonAction 返回到包含ascx 文件?
也许我错过了 MVC Web 开发中的一个常见模式?
谢谢,
最大
更新:这里是关于我正在寻找的模式的更多描述:
部分视图应该是地址编辑器。它可以验证地址,显示 验证错误并将信息保存回数据库。
地址编辑器将位于具有不同控制器/操作的许多页面上。
在经典的 webform 中,ascx 控件可以通过许多回发自行与用户完美交互,而不会更改 url 或干扰整个页面流程。 MVC 中类似场景的正确模式是什么?
更新 2:
不确定这与 webform 的 statefullness 有什么关系。完全不同的功能。这是关于一个控制器调用另一个子控制器(或子控制器)来处理部分视图。请参阅此评论末尾的示例。
我只是想实现相同级别的封装和关注点分离。如果 MVC 框架没有这个,那就是一个严重的弱点。
在 MVC 中,我们如何才能拥有一个能够处理表示和逻辑并驻留在另一个父页面中而不受任何干扰的“事物”(或缺少更好选择的部分视图)?
据我了解,MVC 中的局部视图只是表示,不能有专用控制器而不干扰主控制器。希望我记错了
再举一个例子,考虑一下你正在阅读的这个页面“stackoverflow.com/questions/{id}”。它包括一个“添加评论”组件。添加注释可能会进行服务器端验证以防止无效的 cmets。您如何创建一个可以驻留在任何页面上并处理必要的控制器逻辑的端到端“添加评论”组件?我能想到的唯一方法是修改主机页面的控制器,以便能够向用户提供验证消息并要求他们通过回发来纠正错误。这意味着您将组件添加到 10 个不同的页面,您必须修改 10 个不同的控制器。这会杀死“干”
我希望我错了!因为到目前为止我喜欢 MVC。
结论:
我将肯尼的回复标记为答案;但是,从封装、可重用性和 DRY 原则的角度来看,我认为这是 MVC 框架的一个严重弱点。
我的观点与网络表单的状态无关。
请允许我解释一下:
在 webforms 中,您可以 100% 将复杂的功能封装在 ascx 控件中,当然还有相关的 classlib DLL。一 (1) 名开发人员可能会花费数周时间来开发它。一旦他的工作完成,没有人需要知道任何关于它的东西,只需使用它。用户控件可以在许多页面中重复使用,而不会因 ascx 组件中发生的详细活动而打扰其他“开发人员”。
相比之下,您永远无法使用 ascx 部分需要与用户交互的 ASP.NET MVC 实现相同的目标。一旦 ascx 需要交互,它就需要它自己的控制器,并且控制器需要保留 ModelState。
Jeremy Skinner 在 MVCContrib 中介绍了 [ModelStateToTempData]: http://www.jeremyskinner.co.uk/2008/10/18/storing-modelstate-in-tempdata-with-aspnet-mvc/ 但是,这只是一个补丁。
一个好的框架应该允许开发人员 100% 地封装他们的工作——在控件、部分、ascx 或任何东西中——并将其提供给团队的其他成员,这样他们就可以在不知道任何数据的情况下“直接使用它”。 Winform 在许多复杂的场景中完美地提供了这一点。
尽管欢迎。
标签: model-view-controller asp.net-mvc-2