2016-04-18 16 views
2

Stellen Sie sich folgende Situation vor: Ich möchte den Benutzer eine Auszahlung machen lassen. Wenn es gelingt, sollte ich ihn zur Aktion namens Index von HomeController umleiten. Wenn dies nicht der Fall ist (z. B. der Kontostand ist geringer als die Abhebungssumme), möchte ich einen validierungsbasierten Fehler anzeigen.mvc, ajax und umleiten auf Seite

Jetzt kann ich keine geeignete Validierungsregel während der Projektphase angeben (da es keine statische Regel wie Required ist, ändert sich der Saldo die ganze Zeit), also bin ich gezwungen, einige Laufzeitüberprüfungen beim Benutzer durchzuführen. Das ist in Ordnung, aber jetzt habe ich mich gefragt, ob es in diesem Fall möglich ist, die Seite nicht nach dem Beitrag zurückzuschicken.

Daher habe ich versucht @using(Ajax.BeginForm(...){} und in der Controller-App konnte ich die Benutzereingabe überprüfen. Wenn dies falsch ist, könnte ich den Fehler zum Modell hinzufügen (allgemein oder zu einer bestimmten Eigenschaft) und eine Teilansicht einschließlich dieses Fehlers zurückgeben, die kein Zurücksetzen der Seite verursacht. Dies macht das gleiche Verhalten wie die Standard-jQuery-Validierung, aber natürlich stoppt es Post-Back nicht und zeigt nur eine aktualisierte Teilansicht an.

Das Problem ist, wenn die Eingabe korrekt ist - dann RedirectToAction("Index", "Home") macht die Generierung der Index.cshtml als Teilansicht (so Kopfzeile und Fußzeile meines Layouts in diesem Fall verdoppelt) und das ist verständlich, da es Stil AJAX-Anfrage ist.

Nun, meine Frage ist - vor allem, ist meine Überlegungen überhaupt notwendig? Ich meine, ich dachte nur, dass das Zurückstellen in diesem Fall nicht benutzerfreundlicher sein könnte. Und wenn ja, gibt es einen anderen Ansatz, den ich in diesem Fall anwenden könnte? Ich brauche Daten aus dem gegebenen Kontext (wie Datenbank), dann kann ich nicht einfach das Postback auf der Client-Seite stoppen.

+0

Ein bisschen unklar, was Sie tun möchten. Wenn Sie letztendlich umleiten möchten, führen Sie eine normale Übermittlung durch. Fügen Sie im Controller eine bedingte Überprüfung hinzu und, falls nicht gültig, fügen Sie einen 'ModelStateError' hinzu und geben Sie die Ansicht zurück, so dass der Fehler angezeigt wird (obwohl Sie immer ein eigenes bedingtes Validierungsattribut erstellen können, damit Sie die clientseitige Validierung erhalten oder ein' RemoteAttribute 'verwenden ') –

+0

Ist es akzeptabel, mit Client-Skript (Javascript) umleiten, nach dem Post? – smoksnes

Antwort

0

Mit dem Plugin Jquery Validate können Sie die Überprüfung auf der Clientseite durchführen, ohne tatsächlich mit dem Server zu interagieren. Es gibt ein paar saubere Lösungen in den unten stehenden Link:

How can I validate that the max field is greater than the min field?

Die unten ist eine Adaption des ersten jsfiddle in der Zeit nach oben verbunden.

$.validator.addMethod("greaterThan", 
    function(value, max, min){ 
     return parseInt(value) > parseInt($(min).val()); 
    }, "Max must be greater than min" 
); 

$('#sales').validate({ 
    rules: { 
    maxWithdrawal: {greaterThan: '#balance'} 
    } 
}); 
Verwandte Themen