2009-12-18 111 views
4

作为一个学习锻炼,我想迁移现有的Flash应用程序到ASP.NET MVC。它有大约20种形式,虽然它大部分是线性的,但根据用户决定或返回的数据有一定程度的备用流。工作流在ASP.NET MVC

任何人都可以点我的控制器将如何处理这个正确的方向?我不希望我的意见必须弄清楚他们下一步要去哪里。

更新

我想我可能不会理解这个建设的正确道路。我看到每个控制器都在照顾应用程序的不同部分,并且有一个主控制器负责工作流程。

如果这不是我应该采取的做法,什么是这样做的最佳方式?

更新2

将动物园在ASP.NET MVC 2照顾这个切片应用的?我真的不喜欢在一个控制器动作太多的想法...

+0

请记住,您的控制器促进了很多视图逻辑 - 因此,只有一个控制器管理所有工作流程交互才有意义,如果您只以一种方式查看工作流程。我更喜欢有一个与工作流程交互的服务层 - 您的控制器然后与服务交互 – 2009-12-21 13:05:17

回答

3

一般:

控制器通常是与应用程序的逻辑连贯块(所以为什么你经常看到UserController中/ OrderController等等等等)应对行动的集合。

MVC应用程序应该使用PRG(post-redirect-get)来构建,这意味着您将对每个表单有两个操作,一个会显示表单,第二个操作同名,但用[AcceptPost]装饰,它将处理表单并根据结果将用户重定向到适当的位置。

学习如何工作的,并迁移您的应用程序在最简单的方法是模型中的每个窗体作为一个简单的DTO,没有逻辑,建立各种形式和2个操作的视图。

一旦你的逻辑控制器工作,你可能想出来迁移它变成某种形式的服务可以注入到控制器。

专为您的工作流程:

每个工作流程也许应该有它自己的控制器。使用某种形式的状态模式(取决于工作流的复杂性)对它们进行建模可能很有用,并且可以提供每个状态转换的结果,您的控制器可以将其转换为工作流中下一步的重定向。

+0

对于每个视图,您并不总是需要两个操作。如果你正在显示一个列表(带链接),你只需要一个GET。如果你点击其中一个链接并显示详细信息,你仍然只需要一个GET。如果你点击细节视图上的编辑链接,现在你需要一个GET和一个POST。 – 2009-12-21 20:35:58

+2

该行说“每个表单有两个操作”,而不是每个操作的两个操作 – Neal 2009-12-22 01:39:54

1

当一个表单提交到一个控制器动作是控制器动作来决定如何投递结果确实和查看渲染未来或重定向:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult HandleFormSubmission(FormCollection col) 
{ 
    // do something with posted data 
    // redirect to /someOtherController/someOtherAction 
    // which could show some other form 
    return RedirectToAction("someOtherAction", "someOtherController"); 
} 
+0

感谢您的快速响应。我一直在想,因为有这么多形式,每个人都应该有自己的控制器,但是听起来只有一个控制器是必要的?然后每个行动都可以将责任移交给控制者,以决定下一步该去哪里? 这不是一个潜在的巨大控制器吗? – Paul 2009-12-18 09:48:30

+0

@Paul,是的,它确实为潜在的大型控制器做出了贡献,但与所有的OO一样,您可以随时重构,也许可以通过在控制器后添加服务层。 – 2009-12-21 20:37:52

1

我同样的问题(使用Windows工作流基础与ASP.NET MVC)挣扎,我的博客上讲述它here

也许你会发现它有用,推对不起我自己的链接

+0

链接已死..... – Jack 2016-01-22 13:13:04

+0

@Jack更新了链接... – 2016-01-29 22:17:07