Model view controller MVC:如何以与webforms ascx控件相同的效率在MVC ascx部分视图中封装逻辑?

Model view controller MVC:如何以与webforms ascx控件相同的效率在MVC ascx部分视图中封装逻辑?,model-view-controller,asp.net-mvc-2,Model View Controller,Asp.net Mvc 2,我必须在我的MVC应用程序中构建一些ascx局部视图,以封装可重用功能以及归档SOR和SOC。然而,我遇到了如何封装驱动MVC ascx视图的业务逻辑的挑战 在webforms中,ASCX控件的代码隐藏可以处理按钮单击事件,浏览器仍然显示同一页面,只有一次回发。如何在MVC中归档相同的内容?当~/Address/Edit/2包含一个带有按钮的ascx局部视图,该视图调用另一个MVC操作时——比方说~/ShareController/CommonAction——CommonAction返回到包含a

我必须在我的MVC应用程序中构建一些ascx局部视图,以封装可重用功能以及归档SOR和SOC。然而,我遇到了如何封装驱动MVC ascx视图的业务逻辑的挑战

在webforms中,ASCX控件的代码隐藏可以处理按钮单击事件,浏览器仍然显示同一页面,只有一次回发。如何在MVC中归档相同的内容?当~/Address/Edit/2包含一个带有按钮的ascx局部视图,该视图调用另一个MVC操作时——比方说~/ShareController/CommonAction——CommonAction返回到包含ascx文件的同一视图的最佳方式是什么

也许我缺少了MVC web开发中的一种常见模式

谢谢,

马克斯

更新:以下是关于我正在寻找的模式的更多描述:

部分视图应该是地址编辑器。它可以验证地址,如图所示 验证错误并将信息保存回数据库

地址编辑器将位于具有不同控制器/操作的许多页面上

在经典的webform中,ascx控件可以通过多次回发自己与用户完美交互,而无需更改url或干扰整个页面过程。MVC中类似场景的正确模式是什么

更新2:

不确定这是否与webform的状态完整性有关。完全不同的特征。这是关于一个控制器调用另一个子控制器(或子控制器)来处理局部视图。请参见本评论末尾的示例

我只想实现相同级别的封装和关注点分离。如果MVC框架没有这一点,那么它就是一个严重的弱点

在MVC中,我们怎么可能有一个“东西”(或由于缺乏更好的替代方案而产生的局部视图)能够处理表示和逻辑,并且驻留在另一个父页面中而不受任何干扰

据我所知,MVC中的局部视图只是一种表示,如果不干扰主控制器,就无法拥有专用控制器。我希望我弄错了

给你另一个例子,考虑你正在阅读的页面“StAdvult.com /Quase/{ID}”。它包括一个“添加注释”组件。添加注释可能会执行服务器端验证以防止无效注释。如何创建可以驻留在任何页面上并处理必要控制器逻辑的端到端“添加注释”组件?我能想到的唯一方法是修改主机页的控制器,以便能够向用户提供验证消息,并要求他们通过回发更正错误。这意味着您将组件添加到10个不同的页面,您必须修改10个不同的控制器。这会杀死“干的”

我真希望我错了!因为我喜欢MVC

结论:

我把肯尼的回答作为答案;但是,从封装性、可重用性和干性的角度来看,我认为这是MVC框架的一个严重弱点。p> 我的观点与webforms的状态无关

请允许我解释一下:

在webforms中,您可以100%地将复杂的功能封装在ascx控件中,当然还有相关的classlib DLL。一(1)名开发人员可以花费数周的时间进行开发。一旦他的工作完成,没有人需要知道任何关于它的事情,只需要使用它。用户控件可以在许多页面中重用,而不必为ascx组件中发生的详细活动而打扰其他“开发人员用户”

相比之下,在ASP.NET MVC中,ascx部分需要与用户交互,您永远无法实现同样的效果。一旦ascx需要交互,它就需要自己的控制器,并且控制器需要保留ModelState

Jeremy Skinner在MVCContrib中引入了[ModelStateToTempData]: 然而,这只是一个补丁

一个好的框架应该允许开发人员100%地将他们的工作封装在控件、部分、ascx或其他任何东西中,并将其提供给团队的其他成员,这样他们就可以在不知道任何数据的情况下“使用它”。Winform在许多复杂场景中完美地实现了这一点


尽管欢迎使用。

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

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

传入一个在单击时提交到的。如果您希望页面重定向回您所在的页面,您可以重定向并重新保存您的ModelState(提示13)。重定向可以通过引用或将操作和控制器名称发送到操作方法来完成


如果这不起作用,您可以始终使用Ajax?

我认为在MVC中处理这类功能的正确方法是通过Ajax调用


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

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


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

在您的特定场景中,部分视图用于什么?点击按钮的目的是什么?嗨,杰夫,刚刚添加了更多的评论。谢谢。当部分视图需要通过一些回发来显示验证反馈时,重定向不起作用。当你重定向ModelState时,它就消失了。看起来你被WebFor困住了