关于asp.net mvc:如何在MVC中跨视图传递模型数据?

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" }))
    {

问题是,当我要完成注册时,模型值是空的…有什么想法或者这不可能吗?还是应该这样做,我需要再次检查我的登记簿完成吗?


您可以使用TempData并将您的模型存储在其中,然后从中接收您的模型。

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),也可以是某种描述的数据库。

存储模型服务器端的优势在于,在将数据发送到客户机和接收数据之间,您可以确保数据没有被篡改。