Asp.net mvc 如何在MVC中跨视图传递模型数据?

Asp.net mvc 如何在MVC中跨视图传递模型数据?,asp.net-mvc,razor,Asp.net Mvc,Razor,我试图弄清楚如何在视图之间传递模型 这就是我正在做的,我有一个Register,RegisterConfirm,RegisterComplete视图 用户从Register开始,填写信息,单击continue并发布到RegisterConfigure,然后单击复选框以同意隐私策略,然后发布到RegisterComplete,后者根据第一个Register视图中的模型创建用户 代码: [获取(“账户/注册”)] 公众行动结果登记册() { 返回视图(); } [发布(“账户/登记/确认”)] 公共

我试图弄清楚如何在视图之间传递模型

这就是我正在做的,我有一个Register,RegisterConfirm,RegisterComplete视图

用户从Register开始,填写信息,单击continue并发布到RegisterConfigure,然后单击复选框以同意隐私策略,然后发布到RegisterComplete,后者根据第一个Register视图中的模型创建用户

代码:

[获取(“账户/注册”)] 公众行动结果登记册() { 返回视图(); } [发布(“账户/登记/确认”)] 公共操作结果注册表确认(注册表模型) { if(ModelState.IsValid) { 返回视图(模型); } else{返回视图(“寄存器”,模型);} } [发布(“账户/登记/完成”)] 公共行动结果注册完成(注册模型,bool agree) { 如果(同意){ //创建用户 } 返回视图(“寄存器”,型号); } 视图形式

Register: @using (Html.BeginForm("RegisterConfirm", "Account", FormMethod.Post, new { @id = "create" })) { Register Confirm: @using (Html.BeginForm("RegisterComplete", "Account", FormMethod.Post, new { @id = "create" })) { 登记册: @使用(Html.BeginForm(“RegisterConfirm”、“Account”、FormMethod.Post、new{@id=“create”})) { 注册确认: @使用(Html.BeginForm(“RegisterComplete”、“Account”、FormMethod.Post、new{@id=“create”})) {
问题是,当我进入RegisterComplete时,模型值为空…有什么想法吗?或者这是不可能的?或者这是否有效,我需要再次检查我的RegisterComplete?

您的RegisterConfig视图是否使用仅显示元素来显示注册信息?如果是这样,MVC将无法绑定数据来填充模型

您需要将模型呈现为输入元素(即使它们是隐藏的),以便模型绑定器可以填充RegisterModel(您可以将属性呈现为“数据保留”的隐藏元素和显示的输出元素)

如果使用的是输入元素,请检查这些元素的名称是否与RegisterModel的属性名称匹配,否则,模型绑定器将无法再次填充RegisterModel

如果出于任何原因无法将数据放在RegisterConfig视图的输入元素中,则需要将数据存储在服务器端的某个位置,或者存储在会话状态(或者TempData,它无论如何都使用会话状态)中,或者存储在某个描述的数据库中


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

您可以使用
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);
        }

我认为这是因为我在RegisterConfirm中没有数据元素,并且隐藏输入元素是不可行的,因为RegisterModel将包含它们创建的密码,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);
        }