我正试图弄清楚如何跨视图传递模型
这是我正在做的事情,我有一个Register,RegisterConfirm,RegisterComplete视图。
用户从注册开始,填写信息,点击继续并发布到RegisterConfirm,他们点击复选框以同意隐私政策,然后发布到RegisterComplete,根据第一个注册视图中的模型创建用户。
代码:
[GET("Account/Register")] public ActionResult Register() { return View(); } [POST("Account/Register/Confirm")] public ActionResult RegisterConfirm(RegisterModel model) { if (ModelState.IsValid) { return View(model); } else { return View("Register", model); } } [POST("Account/Register/Complete")] public ActionResult RegisterComplete(RegisterModel model, bool agree) { if (agree) { // Create User } return View("Register", model); }
查看表单
Register: @using (Html.BeginForm("RegisterConfirm", "Account", FormMethod.Post, new { @id = "create" })) { Register Confirm: @using (Html.BeginForm("RegisterComplete", "Account", FormMethod.Post, new { @id = "create" })) {
问题是,当我到达RegisterComplete时,模型值是空的......任何想法或这是不可能的?或者这应该工作,我需要仔细检查我的registercomplete?
答案 0 :(得分:4)
您的RegisterConfirm视图是否使用仅显示元素来显示注册信息?如果是这样,MVC将无法绑定数据以填充模型。
您需要将模型渲染为输入元素,即使它们被隐藏,以便模型绑定器可以填充RegisterModel(您可以将属性渲染为“数据保留”的隐藏元素和显示的输出元素)。
如果您使用的是Input元素,请检查这些元素的名称是否与RegisterModel的属性名称匹配,否则,模型绑定器将无法填充RegisterModel。
如果由于某种原因无法将数据放入RegisterConfirm视图中的Input元素中,则需要将数据存储在服务器端的某个位置,或者在Session State(或TempData,无论如何都使用Session State) )或在某些描述的数据库中。
存储模型服务器端的优点是,您可以确保数据在发送到客户端和接收之间没有被篡改。
答案 1 :(得分:4)
您可以使用TempData
并将模型存储在其中并从中接收模型
[POST("Account/Register/Confirm")]
public ActionResult RegisterConfirm(RegisterModel model)
{
if (ModelState.IsValid)
{
//store data for any other request
TempData["newUser"]=model;
return View();
}
else { return View("Register", model); }
}
[POST("Account/Register/Complete")]
public ActionResult RegisterComplete(RegisterModel model, bool agree)
{
//retrieve data back irrespective of use choice
//to clear memory
RegisterModel newUser= TempData["newUser"];
if (agree) {
// Create User
//use newUser
}
return View("Register", model);
}