2011-07-23 80 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); 
     } 
相關問題