ASP.NET MVC - Übergabe von Daten über Ansichten hinweg

8

Ich baue eine MVC-Anwendung. Eine meiner Aufgaben ist es, ein Geschäft zu bauen. Ich richte einen "Wizard" wie eine Reihe von Ansichten ein, die den Benutzer dazu bringen, verschiedene Arten von Daten bis zum Ende der Operation in insgesamt 7 Schritten zu füllen.

Mein Problem besteht darin, wie einige Daten zwischen all diesen Ansichten geteilt werden.

Zuerst habe ich altmodisch Session verwendet und alles funktionierte auf meinem Desktop, aber als ich meine Anwendung schließlich auf dem Hosting-Server meiner Firma bereitgestellt habe, habe ich Ausnahmen bekommen, weil Session während einiger Schritte zufällig gelöscht wurde.

Nun habe ich alles modifiziert, um alle Daten einzurichten, die ich in TempData brauche, und alle Daten in jedem Schritt zu aktualisieren, und es scheint richtig zu funktionieren.

Ich bin ein wenig verwirrt!

Meine Verwirrung betrifft all diese Strukturen: Sitzung (ich weiß, dass sie von asp.net kommt), ViewData , TempData und die magische ViewBag .

Ich lese viel darüber, aber ich brauche jemanden, der mir klar sagt, was mir in diesem Fall besser passt.

    
JasonMenny 01.09.2011, 08:33
quelle

3 Antworten

3

Ich würde sagen, der ViewBag ist perfekt für so etwas. Nun beziehen Sie sich auf den ViewBag als "Magic" Viewbag, aber in Wirklichkeit wird nur das ViewData umgebrochen, welches ein Wörterbuch von <string,object>

ist

Wie der ViewBag funktioniert, ist es nur ein dynamischer Wrapper um die ViewData. Wenn Sie also nach etwas fragen, sagen wir ViewBag.ShoppingCart, fragt es im Grunde nach dem zugrunde liegenden Wörterbuch, wenn es einen Eintrag namens "ShoppingCart" hat das Element.

UPDATE Problem ist, dass ich nicht daran gedacht habe, dass ViewBag und ViewData view-spezifisch sind, also geleert werden, wenn Sie eine andere Ansicht / Aktion treffen.

Wenn Sie nicht möchten, dass das ShoppingCart (oder der Assistent-Fortschritt) in einer Datenbank gespeichert wird, würde ich in Ihrem Fall nach ViewBag TempData gehen:)

Sie können auch einen Blick auf diesen Artikel von Rachel Apple für ein bisschen mehr Informationen über die drei:

Ссылка

(Ps. Ich würde empfehlen, die Kommentare auch auf diesem Post zu lesen, um unvoreingenommenere Meinungen zu bekommen)

    
Yngve B-Nilsen 01.09.2011, 08:46
quelle
2

Nichts ist falsch mit versteckten Feldern - zumindest in meinem Buch.

Ich würde das Session-Problem beheben, anstatt zu versuchen, Code für das Problem zu schreiben. Führen Sie einen einfachen Test aus: Ändern Sie den Sitzungsanbieter in SQL, deaktivieren Sie die ausgeblendeten Felder und überprüfen Sie, ob Ihre App ordnungsgemäß funktioniert. Wenn dies nicht der Fall ist, gibt es andere (größere) Probleme, um die Sie sich sorgen müssen.

Soll diese App in einer Webfarm / "Cloud" / hinter einem Load-Balancer funktionieren? Wenn ja, müssen Sie entweder:

  • Ändern Sie den Sitzungsanbieter in etwas anderes: SQL, StateServer, Memcache usw. Es sind nicht viele Codeänderungen erforderlich.

Ссылка und Ссылка

ODER

  • Gestalten Sie Ihre Wizard-Schritte neu und reduzieren Sie die Abhängigkeit von gemeinsamen Werten zwischen Ansichten. Sitzungs-ID ist alles was Sie brauchen, und Sie können die DB für alles andere abfragen. Nicht sehr schnell, aber sicher und stabil.

Optimize: Verwenden Sie so viele versteckte Felder, wie Sie möchten, um die Anzahl der DB-Abfragen zu reduzieren (wie gesagt, daran ist nichts falsch), aber normalerweise reicht ein Feld aus, um Ihren serialisierten Status zwischen Anfragen zu halten: Ссылка .

Auch wenn Sie sich nicht um mehrere Instanzen Ihrer App kümmern müssen (auf verschiedenen Computern), führt IIS die Worker-Prozesse hin und wieder wieder zurück. Wenn dies der Fall ist, können zwei Instanzen gleichzeitig (für kurze Zeit) auf demselben Computer ausgeführt werden, und einige Ihrer Benutzer haben möglicherweise Pech, in diesen Augenblicken genau auf den Server zu treffen.

Es spielt keine Rolle, ob die nächste Anfrage auf eine andere Instanz Ihrer Anwendung trifft. Versuchen Sie immer, dieses Ziel zu berücksichtigen.

Ich hoffe, es hilft!

    
bkdc 01.09.2011 10:13
quelle
0

Sie haben hier mehrere Möglichkeiten: Verwenden Sie Session, ViewData (oder ViewBag), müssen Sie diese jedoch mit versteckten Feldern oder Cookies weitergeben.

Viewdata hat das Problem, das mehr Arbeit bringen wird.

Ich würde mit der Sitzung gehen, aber vielleicht wird es in Ihrem Fall gelöscht, weil Sie wahrscheinlich mehr als einen Server haben und wenn die zweite Anfrage auf einen anderen Server kommt, wird es einfach nicht die Daten aus dem vorherigen Schritt haben / p>

Löse dieses Problem mit einem Server, der die Sitzung für alle Server enthält, oder verwende Cookies (wenn die Information NICHT kritisch ist).

    
Fabio Milheiro 01.09.2011 10:06
quelle

Tags und Links