2009-07-07 11 views
3

Wie übergeben Sie Parameter in ASP.net MVC über zwei Ansichten, wie ein Assistent?Entwurf Vorschlag für die Übergabe von Parametern in MVC

Oder was ist die beste Praxis?

Ich arbeite an einer Inhouse-Bug-Tracking ASP.net-Anwendung, die auf MVC verschoben wird, ich kann nicht scheinen, die ASPX aus meinem Kopf schütteln und bin im Kreis.

In der ASPX-Anwendung.

Seite1 -> Projekt auswählen, übergeben projectId in Abfragezeichen
Seite 2 -> Select IssueType, übergeben projectId und Issuetype in Abfragezeichen
Page3 -> Neue Ausgabe, können wir die projectId und IssueType Form erhalten Abfragezeichen

Wie erstellen wir den oben genannten Fluss in MVC?

+0

Wollen Sie um es mit 'a' Tag-Links oder Formular (wahrscheinlich wählen) Elemente zu tun? – Charlino

+0

Können Sie bitte den Unterschied bei der Verwendung der "a" -Tag-Links oder -Formulare erklären. – Picflight

Antwort

3

Eine gängige Praxis für Systeme vom Typ "Wizard" ist die Verwendung eines einzelnen Elements <form> mit Informationen aus vorherigen Fenstern in ausgeblendeten Feldern.

Edit: per der Anfrage, hier ist ein Beispiel (Ich bin nicht vertraut mit ASP.net, so müssen Sie dies in Code selbst übersetzen :(). Sagen Sie, Sie haben eine Website, die Autos verkauft, und in Ihr Bestellformular Sie zunächst über das Modellauto fragen, und in den nachfolgenden Bildschirmen Sie Optionen anbieten, die für dieses Fahrzeug gelten.

<form action="order-wizard.html" method="POST"> 
    <!-- which step of the wizard are we on? --> 
    <input type="hidden" name="step" value="1" /> 
    <!-- Get some info from the user for the first step of the wizard --> 
    <select name="Model"> 
     <option value="Sedan">Sedan</option> 
     <option value="Coup">Coup</option> 
     <option value="Pickup">Pickup</option> 
     <option value="Van">Van</option> 
    </select> 
    <input type="submit" /> 
</form> 

Wenn der Benutzer ein Modell wählt und sendet das Formular kann der Regler für order-wizard.html feststellen, dass die step Option ist 1, und weiß, um zu überprüfen, dass der Benutzer ein Modell ausgewählt hat.Gan dann generieren Sie eine Seite wie folgt: (unter der Annahme, dass der Benutzer "Pickup")

<form action="order-wizard.html" method="POST"> 
    <!-- which step of the wizard are we on? --> 
    <input type="hidden" name="step" value="2" /> 
    <!-- Stored results from the previous stage of the wizard --> 
    <input type="hidden" name="Model" value="Pickup" /> 
    <!-- Additional information for the wizard. More than one option can be 
     requested for each stage of the wizard. --> 
    <select name="Style"> 
     <option value="Short Bed">Short Bed</option> 
     <option value="Long Bed">Long Bed</option> 
     <option value="Extended Cabin">Extended Cabin</option> 
     <option value="Dually">Dually</option> 
    </select> 
    <select name="Interior"> 
     <option value="Cloth">Cloth</option> 
     <option value="Leather"> Leather </option> 
    </select> 
    <input type="submit" /> 
</form> 

Wenn der Assistent weitere Informationen sammeln muss, können auf diese Weise zusätzliche Seiten mit versteckten Eingaben erstellt werden. Andernfalls, wenn dies die letzte Seite war und alle Informationen gesammelt wurden, konnte der Code für diese Seite das Formular dann als normal verarbeiten, so als ob alle Eingaben vom Benutzer auf einer einzelnen Seitenanforderung gegeben worden wären.

Der Vorteil dieser Technik besteht darin, dass der Server keine Sitzungsinformationen zwischenspeichern muss. Ein weiterer Vorteil ist, dass es eine Art RESTful-Schnittstelle bietet, bei der eine einzelne Seitenanforderung von einem anderen Tool alle Eingaben für das Formular generieren kann, wobei die dazwischen liegenden Assistentenseiten übersprungen werden.

Ein Nachteil ist, dass, da die Seite basierend auf Benutzeranforderungen dynamisch generiert wird, der Client neu beginnen muss, wenn sie sich von der Seite entfernen. Lesezeichen funktionieren einfach nicht. Bei der Validierung wird auch nichts gespeichert, da Formulareingaben dieser Art leicht gefälscht werden können.

+0

Können Sie bitte auf ein Beispiel beziehen, wie dies mit einzelnen

Element zu erreichen. – Picflight

4

Ich stimme TokenMacGuy zu, aber manchmal kann das nicht lebensfähig sein.

In diesem Fall müssen Sie benutzerdefinierte Klassen in Ihrem Controller erstellen, an den Ihre Ansicht gebunden werden kann. Wenn Sie die Seite dann übergeben, können Sie mit UpdateModel die Werte abrufen und zu einer anderen Aktion umleiten, wobei entweder das Modell erneut übergeben wird, um weitere Details einzugeben, oder ein neues Modell für diese Ansicht.

Nehmen wir an, Sie haben einen zweiseitigen Assistenten. Beide Ansichten erben von <MyApp.Controllers.Wizard>.

In Ihrem Controller haben Sie einen Klassenassistenten, der so aussehen kann;

public class Wizard 
{ 
    string FirstName {get;set;} 
    string LastName {get;set;} 
    string eMail {get;set;} 
} 

E-Mail wird in Schritt 2 Ihres Assistenten erfasst.

In Schritt 1 haben Sie zwei Felder Namen Vornamen und Nachnamen und auf dem Postbacks Sie einfach Updatemodel (Wizard Objekt) verwenden, um die Werte zu erhalten.

Dieses Modell hat jetzt ein Problem hat, dass Sie benötigen um das gesamte Modell an Ansicht 2 zu übergeben, einschließlich der Daten, die nicht aus Ansicht 1 benötigt werden. Auf der Rückseite von Ansicht 2 führen Sie dann UpdateModel (Wizard-Objekt) erneut aus, um die ersten 2 Felder und dann die E-Mail zu erhalten.

Vorname und Nachname in der 2. Ansicht möglicherweise in ausgeblendeten Feldern.

Das ist 1 Weg und wirklich nicht die beste, jetzt, dass ich es auf dem Bildschirm sehe. Sie könnten jeden Schritt in einem Statusdienst speichern, damit Sie nicht jedes Mal die Daten zurückgeben, die sie sauberer machen würden.

JamesShannon Idee ist auch großartig. Assistenten sind so veraltet, ich denke, es sei denn, Sie sind in einem Online-Kauf-Szenario.

Sie können JavaScript verwenden, um Elemente des Assistenten auszublenden und anzuzeigen, sodass sich alle Eingabefelder auf derselben Seite befinden. Dies kann sehr effektiv sein, wenn Sie eine Scroll-Animation haben, um den nächsten Abschnitt zu öffnen, wenn Sie den vorherigen Abschnitt abgeschlossen haben. < = hoffe das macht Sinn.

<script src="/Scripts/jquery-1.3.2.js"></script> 
    <script> 
     $(document).ready(function() { 

      $("#addComment").click(function() { 
      if ($("#divStep2").is(':visible')) { 
       $("#divStep2").slideUp(300); 
      } else { 
      $("#divStep2").slideDown(300); 
       } 
      }); 

     }); 
    </script> 

Der obige Code aktiviert die Animation eines geöffneten und geschlossenen Bereichs, wenn Sie darauf klicken. Dies erfordert natürlich, dass JS auf dem Client-Rechner aktiv ist, also möchten Sie vielleicht, dass alle Abschnitte standardmäßig geöffnet sind, und dann JS verwenden, um sie beim Seiteneintrag zu schließen.

Wenn Sie das tun, dann wenn der Benutzer JS hat, werden sie nette Animationen sehen und wenn nicht, dann werden sie wenigstens alle Abschnitte sehen und das Leben wird gut sein.

JS wäre der beste Ansatz, den ich denke, da Sie keine irrelevanten Daten an jede Ansicht weitergeben müssen und keine Daten an einen Zustandsdienst speichern müssen, den Sie bereinigen müssen, wenn Leute einfach klicken weg von deiner Seite 1/2 Weg durch.

Hoffe, das hilft.

+0

Ja bitte, Probe wäre sehr, sehr hilfreich. – Picflight

+0

Für Assistenten spezifische Szenarien gibt es ein sehr cooler JQuery Assistent Plugin finden Sie hier: http://blog.jerodsanto.net/2008/08/jquery-wizard-redux/ Demo ist hier: http: //jerodsanto.net/src/wizard/demo/ –

+0

Das ist wirklich cool @robert. Wir sind gerade dabei, einen Zauberer zu erreichen, und das kann ziemlich hilfreich sein. Vielen Dank. – griegs

0

Persönlich bevorzuge ich Griegs 'Lösung. Ich habe das selbst gemacht und es ist viel sauberer. Wenn sich die Anforderungen ändern und eine Anforderung besteht, dass Sie zwischen den Seiten hin und her wechseln oder Ihren Status speichern und später zurückkehren können, ist das Modell die einzige Möglichkeit.

aber ... wenn Ihr Beispiel nicht gekünstelt ist, und Ihr Assistent ist wirklich so einfach, wie Sie beschreiben, dann würde ich vorschlagen:

a) Ihre 3 Seite Assistenten Idee Rethink. Vor vier Jahren wäre das der richtige Weg gewesen ... aber jetzt haben wir AJAX. Kombiniere es auf einer Seite.

b) Wenn das nicht klappt ... übergeben Sie die 2 Variablen über ein Formular (ich würde hier Querystrings bevorzugen).

James

+0

Wie übergeben Sie die Parameter in querystring in MVC? Danke, dass Sie die anderen Vorschläge gemacht haben, den Ansatz des Assistenten zu überdenken. – Picflight

+0

AJAX ist großartig, wo es funktioniert, aber es ist eine ziemlich gute Idee, sicherzustellen, dass Ihre Seite auch für Benutzer funktioniert, die kein JavaScript haben, entweder weil es deaktiviert ist oder weil ihr Browser (wie ein mobiler Browser) js nicht unterstützt . – SingleNegationElimination

+0

Sie übergeben die Parameter als Teil des Formulars. Querystring vs Post-Variablen ist nur eine Frage einer anderen Form-Methode (get bzw. post). Also das Formular auf Seite 2 würde wie folgt aussehen:

Verwandte Themen