2017-08-16 45 views
2

我創建了一個頁面,用戶可以從隨機問題中選擇一個答案。我應該在asp.net MVC中存儲我的臨時視圖模型?

控制器包含

public class TestController : Controller 
     { 

      private DBDataContext _context; 
      private HomeViewModel _model; 

      public TestController() 
      { 
       _context = new DBDataContext(); 
       _model = new HomeViewModel(); 
      } 

      // GET: Test 
      [Route("test-online")] 
      public ActionResult Index() 
      { 
       _model = new HomeViewModel() 
       { 
        Categories = _context.Categories.Select(x => x.ToCategories()).ToList(), 
        QuestionModel = new List<QuestionModel>() 
       }; 

       ViewData.Model = _model; 

       return View(_model); 
      } 

      [HttpPost] 
      public void Go(Test t) 
      { 
       _model = (HomeViewModel)ViewData.Model; 
      } 

      protected override void Dispose(bool disposing) 
      { 
       if (disposing) 
       { 
        if (_context != null) 
        { 
         _context.Dispose(); 
         _context = null; 
        } 
       } 
       base.Dispose(disposing); 
      } 
} 

而問題是我應該在哪裏存儲我的_model

當用戶選擇執行一個ajax後到Go方法, 可惜ViewData.Model現在null

我怎麼能解決這個問題的答案嗎? 我試過ViewBagViewData,因爲我不想使用公共靜態屬性。

回答

1

您可以通過Session保持你的模型像下面的代碼。

你設置你在哪裏得到的模型和會話模型和會話

_model = new HomeViewModel() 
     { 
      Categories = _context.Categories.Select(x => x.ToCategories()).ToList(), 
      QuestionModel = new List<QuestionModel>() 
     }; 
Session["model"] = _model; 

//部分//部分

HomeViewModel model = null; 
if(Session["model"] != null) 
{ 
    model = Session["model"] as HomeViewModel; 
    // your code here 
} 

有什麼可以爲應用程序來完成池重置的情況下不會丟失會話數據?

會話狀態工作inProc模式存儲會話狀態在內存中的Web服務器作爲默認情況下,以不失去會話變量在應用程序池的情況下重置你可以改變狀態模式StateServerSQLServer它提供了一個解決方案使Web應用程序重新啓動時保持會話狀態。

詳細參考:https://msdn.microsoft.com/en-us/library/ms178586(v=vs.140).aspx

+0

我應該問什麼與應用程序池重置的數據發生? – OrElse

+2

對於應用程序池重置的情況下,我會建議更改會話狀態模式。參考:https://msdn.microsoft.com/en-us/library/ms178586(v=vs.140).aspx – hasan

3

如果您暫時保存模型以便在另一種方法中使用它,則應該使用TempData。

而不是索引方法中的ViewData,使用TempData。例如:通過使用

_model = TempData["myModel"]; 

請記住,TempData的將保存的數據只有一個要求

TempData["myModel"] = _model; 

您可以檢索你的圍棋方法相同。如果您希望數據持續多個請求,則需要使用TempData.peek和TempData.keep。你可以找到它從下面的鏈接

https://hassantariqblog.wordpress.com/2016/09/02/mvc-when-to-use-keep-vs-peek-in-asp-net-mvc/

+0

,我該問誰與應用程序池的數據恢復會發生什麼? – OrElse

+1

當您深入瞭解TempData的工作方式時,它只不過是存儲在SESSION中的易腐物品。所以,當你使用TempData時,如果你的應用程序池被重新設置或重置,數據可用性將完全取決於你使用的是什麼狀態管理技術...... @hsnbl在他的評論中說過的話也會匹配這個案例 –

相關問題