Asp.net mvc 多视图修改一个对象MVC

Asp.net mvc 多视图修改一个对象MVC,asp.net-mvc,Asp.net Mvc,我正在构建一个服务,它需要一个较长的设置过程。我把它分为4个模型和4个相应的视图。它们是设置、设置2、设置3和设置4。每个视图都从存储在用户对象中的用户收集信息。我一直在这样传递用户: [HttpPost] public ActionResult Setup(FormCollection values) { User registeringUser = new User(); registeringUser.email = User.Id

我正在构建一个服务,它需要一个较长的设置过程。我把它分为4个模型和4个相应的视图。它们是设置、设置2、设置3和设置4。每个视图都从存储在用户对象中的用户收集信息。我一直在这样传递用户:

    [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);
    }
    [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");
            }


        }
    }
出于某种原因,这在第一次跳转(从设置到设置2)时似乎效果很好,但在那之后,我会出现奇怪的行为,比如用户。当用户被传递到另一个视图时,设置为null


在一个相关但略有不同的问题中,我需要最后一个屏幕(Setup4)是递归的。这个屏幕添加了一个用户注册的课程,如果他们没有选中“这是我最后一节课”按钮,它需要基本上清除表单,以便他们可以进入另一个课程

整个控制器如下所示:

    [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);
    }
    [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");
            }


        }
    }
[HttpPost]
公共操作结果设置4(FormCollection值、用户注册表项)
{
//如果复选框未选中,则值[“allClassesAdded”]以字符串形式返回“false”;如果选中,则返回“true,false”。
//解决方案:解析“true”的字符串
if(utils.parseForTrue(值[“allClassesAdded”]))
{
//TODO重定向至“祝贺您完成”页面。
CreateUserInDB(registeringUser);
返回重定向(“/Home”);
}
其他的
{
//构建课程并将其添加到用户列表中
课程c=新课程(价值观);
如果(请求已验证)
{
//registeringUser.currentCourses.Add(c);
注册人地址(c);

return RedirectToAction(“/Setup4”,registeringUser);//您可以在中存储与用户相关的数据,而无需在请求之间传递

像这样吗

[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;
   ....
}

另一个选择是使用js,例如,这样你就不必在两个步骤之间向服务器发出请求。这项工作做得很好。我很惊讶它的实现如此简单。感谢你给出了清晰明了的答案!如果不了解Setup2[HttpGet]方法中的内容,就很难说出发生了什么。