我正在构建一项需要稍微冗长的设置过程的服务。我将它分为4个模型和4个相应的视图。它们是Setup,Setup2,Setup3和Setup4。这些视图中的每一个都从用户收集存储在User对象中的信息。我一直在传递用户:
[HttpPost]
public ActionResult Setup(FormCollection values)
{
User registeringUser = new User();
registeringUser.email = User.Identity.Name;
registeringUser.fName = values["fName"];
registeringUser.lName = values["lName"];
registeringUser.phone = values["phone"];
return RedirectToAction("/Setup2", registeringUser);
}
出于某种原因,这似乎适用于第一次跳转(从Setup到Setup2),但在此之后我得到了奇怪的行为,例如User。将User传递给另一个View时设置为null。
在一个相关但略有不同的问题中,我需要最后一个屏幕(Setup4)是递归的。这个屏幕增加了一个用户注册的课程,如果他们没有检查"这是我的最后一堂课"按钮,它需要基本清除表格,以便他们可以进入另一个课程。
整个控制器看起来像这样:
[HttpPost]
public ActionResult Setup4(FormCollection values, User registeringUser)
{
// values["allClassesAdded"] returns "false" as a string if box is unchecked, returns "true,false" if checked.
// Solution: parse string for "true"
if (utils.parseForTrue(values["allClassesAdded"]))
{
// TODO Redirect to "congratulations you're done" page.
database.CreateUserInDB(registeringUser);
return Redirect("/Home");
}
else
{
// Build course and add it to the list in the User
course c = new course(values);
if (Request.IsAuthenticated)
{
//registeringUser.currentCourses.Add(c);
registeringUser.AddCourse(c);
return RedirectToAction("/Setup4", registeringUser); // <---- This doesn't really work right
//return View();
}
else
{
return Redirect("/Account/Login");
}
}
}
这是我与MVC的第一个项目,所以如果你发现我完全错误地完成了整个事情,请随时回答我提出的问题并提供适当的解决方案来解决这个问题。我将现有的(纯)C#项目移动到MVC,我主要只是坚持如何在MVC的有趣结构中工作。我非常感谢您能给予的任何帮助!
谢谢!
答案 0 :(得分:0)
您可以将用户相关数据存储在session中,而不会在请求之间传递
像这样的Smth
[HttpPost]
public ActionResult Step1(Step1Model model)
{
Session["UserRegistration"] = new UserRegistration
{
FirstName = model.fName,
....
}
....
}
[HttpPost]
public ActionResult Step2(Step2Model model)
{
var userRegistration = Session["UserRegistration"] as UserRegistration;
if (userRegistration == null) { return Redirrect("Step1"); }
userRegistration.SomeField = model.someField;
...
Session["UserRegistration"] = userRegistration;
....
}