2017-08-16 2 views
2

Ich habe eine Seite erstellt, auf der Benutzer eine Antwort aus zufälligen Fragen auswählen können.Wo sollte ich mein temporäres Ansichtsmodell in asp.net MVC speichern?

Der Controller enthält

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

Und das Problem ist, wo soll ich meine _model speichern?

Wenn ein Benutzer eine Antwort ein Ajax Post auf die Go Verfahren durchgeführt wird, aber leider ist die ViewData.Model ist jetzt null

Wie kann ich dieses Problem beheben? Ich versuchte beide mit ViewBag und ViewData, da ich keine öffentliche statische Eigenschaft verwenden möchte.

Antwort

1

Sie Ihr Modell über Session wie folgenden Code zu halten.

// Teil, wo Sie das Modell und die Sitzung

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

// Teil, wo Sie

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

bekommen das Modell und die Sitzung festgelegt Was für die Anwendung getan werden kann, Pool zurücksetzen, um Sitzungsdaten nicht zu verlieren?

Sitzungsstatus arbeitet inProc Modus, die auf dem Web-Server eine Standard im Speicher Sitzungsstatus speichert, um nicht Session-Variablen im Fall der Anwendung Pool verlieren zurücksetzen können Sie Zustandsmodus zu StateServer oder SQLServer ändern, die eine Lösung bereitstellt Der Sitzungsstatus wird beibehalten, wenn die Webanwendung neu gestartet wird.

Details Referenz: https://msdn.microsoft.com/en-us/library/ms178586(v=vs.140).aspx

+0

Sollte ich was fragen passiert mit den Daten zum Application Pool Reset? – OrElse

+2

für Application Pool Reset Fall, würde ich empfehlen, Session-Modus zu ändern. Referenz: https://msdn.microsoft.com/en-us/library/ms178586(v=vs.140).aspx – hasan

3

Wenn Sie Ihr Modell vorübergehend speichern, um es in einer anderen Methode zu verwenden, sollten Sie stattdessen TempData verwenden.

Verwenden Sie anstelle von ViewData in der Indexmethode TempData. Ex:

TempData["myModel"] = _model; 

Sie können das gleiche in Ihrer Go-Methode abrufen, indem

_model = TempData["myModel"]; 

Verwendung Bitte beachten Sie, dass TempData die Daten für nur eine Anforderung halten wird. Wenn Daten länger als eine Anforderung persistent sein sollen, müssen Sie TempData.peek und TempData.keep verwenden. Sie können finden, was sie aus dem untenstehenden Link ist

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

+0

Sollte ich fragen, was mit den Daten auf Anwendungspool geschieht zurücksetzen? – OrElse

+1

Wenn Sie herausfinden, wie TempData funktioniert, ist es nichts anderes als ein verderbliches Objekt, das in SESSION gespeichert ist. Also, wenn Sie TempData verwenden und wenn Ihr App-Pool rezyled oder zurückgesetzt wird, hängt die Verfügbarkeit der Daten vollständig davon ab, welche Art der Verwaltung Sie verwenden ... Was @hsnbl in seinen Kommentaren gesagt hat, wird auch für diesen Fall passen –

Verwandte Themen