如何在MVC中跨视图传递模型数据?

3
我正在尝试弄清楚如何在视图之间传递模型。
这是我的做法,我有一个Register、RegisterConfirm和RegisterComplete视图。
用户从Register开始,填写信息,点击继续并发布到RegisterConfirm,在那里他们点击复选框同意隐私政策,然后发布到RegisterComplete,根据第一个Register视图中的模型创建用户。
代码:
[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) { // 创建用户 } 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?
2个回答

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);
        }

4
你的RegisterConfirm视图是否使用只读元素展示注册信息?如果是这样,MVC无法绑定数据以填充模型。
即使它们是隐藏的,您也需要将模型呈现为Input元素,以便模型绑定程序可以填充RegisterModel(您可以同时将属性呈现为用于“数据保留”的隐藏元素和用于显示的输出元素)。
如果您正在使用Input元素,请检查这些元素的名称是否与RegisterModel的属性名称匹配,否则模型绑定程序将无法填充RegisterModel。
如果由于某种原因您无法在RegisterConfirm视图中将数据放入Input元素,则需要将数据存储在服务器端的某个位置,无论是在会话状态中(或使用会话状态的TempData)还是在某种数据库中。
将模型存储在服务器端的优点是,在将其发送到客户端并收到返回之间,您可以确保数据未被篡改。

我认为这是因为在RegisterConfirm中没有数据元素,而隐藏输入元素不可行,因为RegisterModel将包含他们创建的密码,但TempData可以正常工作,我刚试过并成功传递了,所以我会使用它...谢谢建议。 - jaekie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接