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

时间:2011-07-23 17:04:12

标签: asp.net-mvc razor

我正试图弄清楚如何跨视图传递模型

这是我正在做的事情,我有一个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?

2 个答案:

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