How to pass model data across views in MVC?
我想知道如何在视图之间传递模型
这是我要做的,我有一个注册器,注册器确认,注册器完整的视图。
用户从注册表开始,填写信息,单击继续并发布到注册表确认在哪里单击复选框以同意隐私策略,然后发布到注册表完成,这将根据第一个注册表视图中的模型创建用户。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | [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); } |
视图形式
1 2 3 4 5 6 7 | Register: @using (Html.BeginForm("RegisterConfirm","Account", FormMethod.Post, new { @id ="create" })) { Register Confirm: @using (Html.BeginForm("RegisterComplete","Account", FormMethod.Post, new { @id ="create" })) { |
问题是,当我要完成注册时,模型值是空的…有什么想法或者这不可能吗?还是应该这样做,我需要再次检查我的登记簿完成吗?
您可以使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | [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); } |
您的注册表确认视图是否使用仅显示元素来显示注册信息?如果是这样,MVC将无法绑定数据来填充模型。
您需要将模型呈现为输入元素,即使它们是隐藏的,以便模型绑定器可以填充RegisterModel(您可以将属性呈现为"数据保留"的隐藏元素和显示的输出元素)。
如果使用的是输入元素,请检查这些元素的名称是否与registermodel的属性名称匹配,否则,模型绑定器将无法填充registermodel。
如果由于任何原因无法将数据放入RegisterConfirm视图中的输入元素中,则需要将数据存储在服务器端的某个位置,可以是会话状态(也可以是使用会话状态的tempdata),也可以是某种描述的数据库。
存储模型服务器端的优势在于,在将数据发送到客户机和接收数据之间,您可以确保数据没有被篡改。