Asp.net mvc 多视图修改一个对象MVC
我正在构建一个服务,它需要一个较长的设置过程。我把它分为4个模型和4个相应的视图。它们是设置、设置2、设置3和设置4。每个视图都从存储在用户对象中的用户收集信息。我一直在这样传递用户: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
[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]方法中的内容,就很难说出发生了什么。