2011-07-23 102 views
1

我想弄清楚如何通过视图模型如何在MVC中跨视图传递模型数据?

这是我在做什么,我有一个注册,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

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

您需要将模型渲染为Input元素,即使它们是隐藏的,以便模型联编程序可以填充RegisterModel(您可以将属性同时呈现为“数据保留”隐藏元素和输出显示元素) 。

如果您使用的是输入元素,请检查这些元素的名称是否与RegisterModel的属性名称匹配,否则,模型联编程序将无法填充RegisterModel。

如果因为某种原因无法将数据放入RegisterConfirm视图的Input元素中,则需要将数据存储在服务器端的某个位置,或者在会话状态(或使用会话状态的TempData无论如何)或者在一些描述的数据库中。

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

+0

我想这是因为我没有在RegisterConfirm的数据元素,并具有隐藏输入元素收到你的模型回将不可行,因为RegisterModel将包含他们创建的密码,TempData将工作,只是尝试并正确传递,所以我会用...感谢您的建议 – jaekie

2

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