2012-01-05 79 views
1

林堅持我的MVC3數據和所遇到的一個惱人的問題:模型持久 - 模型設置爲空和不被保存,

可以說我有MyModel a = new MyModel() & MyModel b = new MySubmodel()我在構造函數中定義。

當我訪問第1頁:

if (MyModel.MySubmodel== null) 
    { 
    //populate with defaults 
    }else{ 
    //use existing model data 
    } 

在第1頁,我可以用Html.textboxFor字段更改值。我有我的模型更新:

[AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult Page1(Mysubmodel model) 
     { 

      MyModel.Mysubmodel = model; 
      return RedirectToAction("Page2", "Tool"); 
     } 

使用手錶,我可以看到,我的模型正在更新與新的價值! (這是偉大的!),但是,如果我嘗試返回到我的網頁,以檢查結果將保存它們都設置爲null再次

代碼:

public class MyController : Controller 
{ 
    //set up initial models 
     public MyModel mainmodel = new MyModel(); 
     public MySubModel submodel = new MySubModel(); 
public ActionResult Page1() 
     { 
      tempList.Clear(); 
      service.XmlParseDefault(Request); //Acquire defaults 
      //setup model 
      //could possibly throw this into .services if it becomes a "fat controller" 
      if (mymodel.submobdel == null) 
      { 
       //Apply default values 
      } 
     return View(submodel); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult Page1(submodel model) 
     { 

      mymodel.submodel = model; 
      return RedirectToAction("Page2", "homecontroller"); 
     } 


} 
+0

您是否在任何地方存儲模型?在Db中,或者至少在Session中?發佈完成代碼。 – 2012-01-05 11:10:37

+0

目前它只存儲在構造函數myModel的「a」實例中。 – JustAnotherDeveloper 2012-01-05 11:15:40

+1

@RawryLions - 我假設你在構造函數中初始化模型,但模型實際上並不存儲在構造函數中,它在控制器中定義?這個假設是否正確?如果它是在構造函數中創建的,那麼在構造函數完成後模型將會丟失。 – Dangerous 2012-01-05 11:18:47

回答

0

HTTP:請求/響應協議

一旦服務器通過向客戶端呈現適當的響應(可以是html,xml或json)來滿足請求,所有內容都將從內存中清除。 (例外是會話狀態)。

因此,在您的情況下,當收到請求時,兩個模型實例將在構造函數中創建,並在控制器類超出作用域後銷燬,即呈現視圖。所以,當表單提交時,模型的實例會重新創建,這就是爲什麼它們總是顯示空值的原因。

如果我在回發中使用ViewData來存儲MyModel會怎樣?我是否認爲這會存儲整個模型(使用子模型),然後在頁面的構造函數中讀取它。另外我假設不同於會話,ViewData在一次使用後被autodestroyed?

不要用戶ViewData,總是使用模型並將它們傳遞給視圖。當您回傳時檢索它們。將回發模型分配給模型的新實例,並將更改保存在持久性地方。就像在數據庫或xml文件中一樣。

使用Static類可以幫助你,但不推薦。因爲正如我所說,只要應用程序回收,這些類就會生活。使用數據庫或xml文件。即使用於測試目的

0

執行重定向之後,模型將會丟失,因爲將在Page2的GET請求上重新創建控制器。

所以你的問題最終是如何在從page1到page2的重定向期間存儲子模型模型。

我想這取決於模型包含什麼?

如果模型中的信息不包含敏感信息,那麼我不會發現將模型值存儲在隱藏表單字段中的任何錯誤,這些隱藏表單字段將由Page2中的默認模型聯編程序在子模型中重新創建(請記住惡意用戶可能會更改這些值)。

如果信息更加敏感(或者其中一些是),那麼可以使用TempData傳遞敏感信息(請注意,一旦它在頁面2中讀取,將從TempData中刪除)或者在Session中傳遞將在整個用戶會話期間被存儲。

或者,如果信息更加永久,那麼可以將其寫入數據庫,並在必要時使用此信息重新創建模型。