2010-08-11 47 views
4

我必须在我的MVC应用程序中构建一些ascx部分视图来封装可重用的功能以及归档SOR和SOC。但是,我遇到了如何封装驱动MVC ascx视图的业务逻辑的挑战。MVC:如何在MVC ascx局部视图中封装逻辑与webforms ascx控件具有相同的效率?

在webforms中,ASCX控件背后的代码可以处理按钮单击事件,浏览器仍然只显示一个回发的同一页面。我如何在MVC中归档相同的东西?当〜/ Address/Edit/2包含一个带有一个按钮的ascx局部视图时,它会调用另一个MVC动作 - 让我们假设〜/ ShareController/CommonAction - CommonAction返回到相同视图的最佳方式是什么? ascx文件?

也许我错过了MVC web开发中的常见模式?

谢谢

最大

更新:这是关于我要寻找的模式更多的描述:

应该是一个地址编辑器的局部视图。它可以验证地址,显示 验证错误并将信息保存回数据库。

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

在经典的webform中,一个ascx控件可以通过多次回发完全与用户进行交互,而无需更改导致整个页面处理过程的url dor。 MVC中类似场景的正确模式是什么?

更新2:

不知道这有什么用网页表单的状态(statefullness)。完全不同的功能。这是关于控制器调用另一个子控制器(或子控制器)来处理局部视图。在本评论最后看到我的例子。

我只是想达到相同的封装和关注的分离等级。如果MVC框架没有,那是一个严重的弱点。

在MVC中,我们怎么能有一个“事物”(或缺乏更好的替代方案的部分视图)能够处理演示文稿以及逻辑并驻留在另一个父页面中而没有任何干扰?

我的理解是,MVC中的部分视图只是演示文稿,不能在不干扰主控制器的情况下拥有专用控制器。我希望我错了

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

我希望我错了!因为我喜欢MVC软件。

结论:

标志着我肯尼的答案回复;但是,我认为这是MVC框架从封装,可重用性和DRY主体角度看的一个严重弱点。

我的意见与webforms的statefullness无关。

请允许我解释一下:

在网络表单,您可以100%在ascx控件和课程相关的DLL CLASSLIB的封装复杂的功能。一(1)名开发人员可以花几个星期来开发它。一旦他的工作完成,没有人需要知道任何事情,只是使用它。用户控件可以在许多页面中重复使用,而不会打扰其他“开发人员用户”使用ascx组件中的详细活动。

相比之下,您绝对不能在ASP.NET MVC中实现与ascx部分需要与用户交互的相同内容。一旦ascx需要交互,它需要它自己的控制器,控制器需要保存ModelState。

Jeremy Skinner在MVCContrib中引入了[ModelStateToTempData]: http://www.jeremyskinner.co.uk/2008/10/18/storing-modelstate-in-tempdata-with-aspnet-mvc/ 但是,这只是一个补丁。

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

尽管欢迎。

+0

您在特定场景中使用的局部视图是什么?按钮点击的目的是什么? – 2010-08-11 05:39:29

+0

嗨Jeff, 刚刚添加了更多评论。谢谢。 – DevTeach2010 2010-08-11 13:23:34

回答

0

我不知道如果我把你的问题到100%,但你不能只提供用户控制你需要的数据?

传递给<%= Url.Action()%>提交在点击时转到。如果您希望页面重定向回到您在canredirect上的同一页面并重新保存您的ModelState(http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx提示#13)。重定向可以通过引用来完成,也可以通过将操作和控制器名称发送给操作方法来完成。

如果这不起作用,您可以随时使用Ajax?

+0

Hi Kenny,谢谢你的帮助。你引用我的链接说:“MVCContrib项目也有这个功能,但他们正在做一个我不喜欢的类”你知道MVCContrib是什么确切的功能吗?再次感谢。 – DevTeach2010 2010-08-12 00:40:24

+0

是的,他们使用ModelStateToTempData过滤器。 – 2010-08-12 09:22:49

0

我几乎可以肯定这不是它应该完成的工作,但我通常会查看referer URL并在那里重定向。

+0

部分视图需要通过几次回发显示验证反馈时,重定向不起作用。当您重定向ModelState消失时。 – DevTeach2010 2010-08-11 13:25:07

+0

看起来,你陷入了WebForms的“有状态”范例。从开发人员的角度来看,尝试使Web应用程序“就像”Windows应用程序一样工作,它很大程度上依赖于记住请求之间的表单状态。另一方面,MVC采用Web应用程序来实现它:一系列独立的请求。你应该设计你的应用程序,使你不需要有状态。 – 2010-08-11 14:19:53

+0

Fyodor:请看我的第二次更新 – DevTeach2010 2010-08-11 16:48:58

0

我认为正确的方式来处理这种类型的功能在MVC(和几乎任何其他不是webforms)是通过ajax调用。

如您所见,创建完整页面的回发将会非常棘手。但是,您可以通过将后期操作和验证错误显示合并到ajax操作中来完成所需的任何操作,该操作仅更新包含控件的页面部分,而不是整个页面。

0

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

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