2013-11-23 51 views
0

我遇到了問題,如何正確設計我的控制器的流程巫婆會做一些高級的事情。我必須在我的網站上添加多個步驟。它看起來像這樣:控制器中的高級流程,如何創建可重複使用的控制器方法

public class CoursesController : Controller { 
     [HttpGet] 
     public ActionResult Create() //1 step - User fill some basic infos and send back forms to Save method 
     { 
     return View(model.GetNewInstanceOfCourse()); 
     } 
     [HttpPost] 
     public ActionResult Save(NewCourse newCourse) //2 step - Datas are stored in session 
     { 
     string Token = Guid.NewGuid().ToString("D"); 
     Session.Add(Token, newCourse); 
     return RedirectToAction("Subjects", new { Token = Token }); 
     } 
     [HttpGet] 
     public ActionResult Subjects(string Token) //2 step - Users fill which Subjects will be on the course, then send forms to Confirm method 
     { 
     return View(model.GetAvaliableSubjects(Token/*to place Token in View and let retrieve object from session*/); 
     } 
     [HttpPost] 
     public ActionResult Confirm(Subjects subjects) //3 step - Users filled all required datas and now i want to store complete datas in database 
     { 
     //(assume that Session[...] return Dictionaty<string, ... > instead of object 
     if(!Session["stored-courses-from-first-step"].ContainsKey(subjects.RetrievedFromViewToken) 
     { 
      return RedirectToAction("Create"); 
     } 
     model.AddNewCourse(Session["stored-courses-from-first-step"][subjects.RetrievedFromViewToken], subjects); 
     return RedirectToAction("Index"); 
     } 
    } 

和它的作品完美...但我必須寫現有的課程,以便重新使用第2步在我的控制器的另一部分增加新的課題。我必須填寫一些不同的數據,然後重新使用爲該數據添加主題,然後重新使用函數Confirm,而不是插入一些數據,我想只更新並插入用戶完成的一些數據。

... 
public AddNewSubject(int CourseId) 
{ 
    ... 
} 

在預覽過程中,我有按鈕「添加新的課題」,這應該帶我去AddNewSubject方法,我不知道下一步該怎麼做。我不能用這種方法做這樣的事情:

return RedirectToAction("Save", "Courses", new { newCourse = model.GetExistingCourseAnChangeItToNewCourseInstance(CourseId)}) 

我不想爲此編寫專門的方法,因爲複製這些代碼的大部分。我認爲可以在我的控制器中重新組織流程,但我不知道如何做到這一點。其他問題是我需要重用方法確認,一次它會插入一些數據,其他時間它會更新一些數據。也許你會爲我提供一些很好的提示。

+0

它可能是非常有用的檢查出這個答案以前的SO問題,它提供了一種替代方法來實現這一點:http://stackoverflow.com/questions/6402628/multi-step-registration-process-issues-in -Asp淨MVC-分裂-的ViewModels星/ 6403485#6403485 –

回答

0

對於現有的課程,在那裏你會被傳遞的過程中ID,沒有什麼阻止你重載操作方法:

[HttpPost] 
public ActionResult Save(int CourseId) //2 step - Datas are stored in session 
{ 
    // Do whatever you need to do... 
} 

這樣,您就不必擔心做什麼聰明的,當試圖重用您發佈的第2步代碼。你只需要一個單獨的方法來處理現有的課程。

0

最乾淨的解決方案是從可重用操作中移除真正的邏輯,並將其置於私有方法中。

在該方法中,您決定如何給予一些輸入參數或類似的東西。

因此,在你的行動中,你最終只是調用輔助方法。這個幫助器方法可以在同一個控制器中是私有的......或者如果邏輯量很大,可以創建一個輔助類來託管該邏輯。