我有问题如何为我的控制器设计正确的流量会做一些高级的事情。我必须在我的网站上有多步添加课程。它看起来像这样:
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 :(得分:0)
对于您将传递课程ID的现有课程,没有什么可以阻止您重载操作方法:
[HttpPost]
public ActionResult Save(int CourseId) //2 step - Datas are stored in session
{
// Do whatever you need to do...
}
这样,在尝试重用您发布的第2步代码时,您不必担心做任何聪明的事情。您只需要一个单独的方法来处理现有课程。
答案 1 :(得分:0)
最干净的解决方案是从可重用的操作中删除真正的逻辑,并将其置于私有方法中。
在该方法中,您可以根据输入参数或类似内容来决定做什么。
因此,在您的操作中,您最终只需调用辅助方法。这个辅助方法在同一个控制器中可以是私有的......或者如果逻辑量很大,你可以创建一个辅助类来托管该逻辑。