2009-12-18 108 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