ASP.NET MVC中的工作流程

4
作为学习练习,我想将一个现有的Flash应用程序迁移到ASP.NET MVC。它有大约20个表单,虽然它大多是线性的,但基于用户决策或返回的数据有一定程度的备选流程。
有人能指点一下控制器应该如何处理吗?我不希望我的视图需要弄清楚它们要去哪里。
更新
我认为我可能没有理解构建这个应用程序的正确方法。我看到每个控制器都负责应用程序的不同部分,并且有一个主控制器负责工作流程。
如果这不是我应该采取的方法,那么最好的方法是什么?
更新2
ASP.NET MVC 2中的区域是否可以处理应用程序的这种分组?我真的不喜欢在一个控制器中有太多的操作...

请记住,您的控制器负责大量视图逻辑 - 因此,如果您只以一种方式查看工作流程,则仅使用一个控制器管理所有工作流程交互是有意义的。我更喜欢拥有一个服务层来与工作流进行交互 - 然后您的控制器与服务进行交互。 - Jaco Pretorius
3个回答

3

总体而言:

控制器通常是一组处理应用程序中逻辑上相关块的操作(因此您经常会看到UserController / OrderController等等)。

MVC应用程序应使用PRG(post-redirect-get)构建,这意味着每个表单都有2个操作,一个显示表单,另一个使用相同的名称但带有[AcceptPost]修饰符,该操作将处理表单并根据结果将用户重定向到适当的位置。

学习如何使用此方法并迁移您的应用程序的最简单方法是将每个表单建模为一个没有逻辑的简单dto,为每个表单构建一个视图和2个操作。

一旦控制器中的逻辑正常工作,您可能希望将其迁移到某种可以注入到控制器中的服务中。

特别针对您的工作流程:

每个工作流程可能都应该有自己的控制器。根据工作流程的复杂性,使用某种状态模式进行建模可能很有用,并提供每个状态转换的结果,以便您的控制器可以将其转换为重定向到工作流程中的下一步。


您并不总是需要为每个视图都编写两个操作。如果您正在显示一个带有链接的列表,那么只需要一个GET请求。如果您单击其中一个链接并显示详细信息,则仍然只需要一个GET请求。如果您在详细信息视图上单击编辑链接,则现在需要一个GET请求和一个POST请求。 - Robert Harvey
2
该行代码的意思是“每个表单有2个操作”,而不是每个视图有2个操作。 - Neal

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");
}

感谢您的快速回复。我一直在考虑,由于有这么多表单,每个表单都应该有自己的控制器,但听起来好像只需要一个控制器?然后每个操作可以将责任移交给控制器来决定下一步去哪里? 这不会使控制器变得非常庞大吗? - Paul
@Paul,是的,这可能会导致一个非常大的控制器,但是像所有面向对象编程一样,您总是可以通过在控制器后面添加服务层来进行重构。 - Robert Harvey

1

我曾经遇到同样的问题(在ASP.NET MVC中使用Windows Workflow Foundation),并在我的博客这里中写了一篇文章。

也许你会发现它有帮助,抱歉推销自己的链接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接