Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 控制器中的高级流,如何创建可重用的控制器方法_C#_Asp.net Mvc 3 - Fatal编程技术网

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

C# 控制器中的高级流,如何创建可重用的控制器方法,c#,asp.net-mvc-3,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 {

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

    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");
      }
    }
在课程预览中,我有一个按钮“添加新主题”,这应该会让我使用AddNewSubject方法,我不知道下一步该怎么做。我不能用这种方法做这样的事情:

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

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

对于现有的课程,如果你要通过课程ID,没有什么能阻止你重载操作方法:

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

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

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

在该方法中,您可以在给定一些输入参数或类似参数的情况下决定要执行的操作


因此,在您的操作中,您最终只调用helper方法。此帮助器方法可以在同一控制器中是私有的。。。或者,如果逻辑量很大,您可以创建一个帮助器类来承载该逻辑。

查看前一个SO问题的答案可能非常有用,该问题提供了实现此目的的替代方法:
[HttpPost]
public ActionResult Save(int CourseId) //2 step - Datas are stored in session
{
    // Do whatever you need to do...
}