【问题标题】:MVC: How to encapsulate logic in MVC ascx partial view with the same efficiency of webforms ascx controls?MVC:如何在MVC ascx局部视图中封装逻辑,与webforms ascx控件的效率相同?
【发布时间】: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


【解决方案1】:

我不知道我是否能 100% 解决您的问题,但您不能只向 UserControl 提供您需要的数据吗?

传入一个,点击后提交会转到该位置。如果您希望页面重定向回您所在的同一页面,您可以重定向并重新保存您的 ModelState(http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx 提示 #13)。重定向可以通过引用者或通过将操作和控制器名称发送到您的操作方法来完成。

如果这不起作用,您总是可以使用 Ajax?

【讨论】:

  • 您好,肯尼,感谢您的帮助。您引用我的链接说:“MVCContrib 项目也具有此功能,但他们在一个我不喜欢的课程中执行此功能”您知道它在谈论 MVCContrib 的确切功能吗?再次感谢。
  • 是的,他们使用 ModelStateToTempData 过滤器。
【解决方案2】:

我几乎可以肯定这不是“应该”做的,但我通常会查看引用 URL 并重定向到那里。

【讨论】:

  • 当部分视图需要通过一些回发显示验证反馈时,重定向不起作用。当你重定向时,ModelState 就消失了。
  • 您似乎陷入了 WebForms 的“有状态”范式。从开发人员的角度来看,作为使 Web 应用程序“像”Windows 应用程序一样工作的尝试,它在很大程度上依赖于记住请求之间的表单状态。另一方面,MVC 将 Web 应用程序视为其本来面目:一系列独立的请求。您应该以不需要状态完整性的方式设计您的应用程序。
【解决方案3】:

我认为在 MVC 中处理这种类型的功能(以及几乎任何其他非 Web 表单)的正确方法是通过 ajax 调用。

如您所见,创建整页回发会很尴尬。但是,您可以通过将发布操作和验证错误显示合并到仅更新包含控件的页面部分而不是整个页面的 ajax 操作中来完成您想要的一切。

【讨论】:

    【解决方案4】:

    我正在寻找同样的东西,我遇到了 Html.Action 和 .RenderAction,它们似乎在服务器上执行控制器并返回/注入输出。

    这可以用于 MVC 中的封装和可重用性,但我还没有尝试过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多