控制器中的高级流程,如何创建可重用的控制器方法

时间:2013-11-23 23:42:21

标签: c# asp.net-mvc-3

我有问题如何为我的控制器设计正确的流量会做一些高级的事情。我必须在我的网站上有多步添加课程。它看起来像这样:

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

由于重复了大部分代码,我不想为此编写专门的方法。我认为可以在我的控制器中重新组织流程,但我不知道如何做到这一点。其他问题是我需要重用方法确认,一次它会插入一些数据,其他时候会更新一些数据。也许你会有一些很好的建议。

2 个答案:

答案 0 :(得分:0)

对于您将传递课程ID的现有课程,没有什么可以阻止您重载操作方法:

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

这样,在尝试重用您发布的第2步代码时,您不必担心做任何聪明的事情。您只需要一个单独的方法来处理现有课程。

答案 1 :(得分:0)

最干净的解决方案是从可重用的操作中删除真正的逻辑,并将其置于私有方法中。

在该方法中,您可以根据输入参数或类似内容来决定做什么。

因此,在您的操作中,您最终只需调用辅助方法。这个辅助方法在同一个控制器中可以是私有的......或者如果逻辑量很大,你可以创建一个辅助类来托管该逻辑。