Ich habe eine einfache ASP.NET MVC-Aktion wie folgt:
public ActionResult Edit(EditPostViewModel data)
{
}
Sie EditPostViewModel
haben folgende Validierungsattribute:
[Display(Name = "...", Description = "...")]
[StringLength(100, MinimumLength = 3, ErrorMessage = "...")]
[Required()]
public string Title { get; set; }
In der Ansicht verwende ich die folgenden Helfer:
@Html.LabelFor(Model => Model.EditPostViewModel.Title, true)
@Html.TextBoxFor(Model => Model.EditPostViewModel.Title,
new { @class = "tb1", @Style = "width:400px;" })
Wenn ich auf einem Formular sende, dass dieses Textfeld in eine Validierung eingefügt wird, erfolgt dies zuerst auf dem Client und dann auf service ( ModelState.IsValid
).
Jetzt habe ich ein paar Fragen:
Kann dies stattdessen mit jQuery ajax submit verwendet werden? Ich entferne einfach das Formular und wenn ich auf die Schaltfläche "Senden" klicke, sammelt ein Javascript Daten und führt das aus
$.ajax
.Funktioniert die Serverseite
ModelState.IsValid
?Wie kann ich das Validierungsproblem an den Client zurückleiten und so präsentieren, als würde ich die build int validation (
@Html.ValidationSummary(true)
) verwenden?
Beispiel für einen Ajax-Aufruf:
function SendPost(actionPath) {
$.ajax({
url: actionPath,
type: 'POST',
dataType: 'json',
data:
{
Text: $('#EditPostViewModel_Text').val(),
Title: $('#EditPostViewModel_Title').val()
},
success: function (data) {
alert('success');
},
error: function () {
alert('error');
}
});
}
Bearbeiten 1:
Auf Seite enthalten:
<script src="/Scripts/jquery-1.7.1.min.js"></script>
<script src="/Scripts/jquery.validate.min.js"></script>
<script src="/Scripts/jquery.validate.unobtrusive.min.js"></script>
Antworten:
Client-Seite
Die Verwendung der
jQuery.validate
Bibliothek sollte ziemlich einfach einzurichten sein.Geben Sie die folgenden Einstellungen in Ihrer
Web.config
Datei an:Wenn Sie Ihre Ansicht aufbauen, definieren Sie Folgendes:
HINWEIS: Diese müssen innerhalb eines Formularelements definiert werden
Dann müssten Sie die folgenden Bibliotheken einschließen:
Dies sollte Sie für die clientseitige Validierung einrichten können
Ressourcen
Serverseite
HINWEIS: Dies dient nur zur zusätzlichen serverseitigen Überprüfung über der
jQuery.validation
BibliothekVielleicht könnte so etwas helfen:
Wo
ValidateAjax
ist ein Attribut definiert als:Dadurch wird ein JSON-Objekt zurückgegeben, das alle Ihre Modellfehler angibt.
Beispiel Antwort wäre
Dies wird an Ihren Fehlerbehandlungsrückruf des
$.ajax
Anrufs zurückgegebenSie können die zurückgegebenen Daten durchlaufen, um die Fehlermeldungen basierend auf den zurückgegebenen Schlüsseln nach Bedarf festzulegen (ich denke, so etwas
$('input[name="' + err.key + '"]')
würde Ihr Eingabeelement findenquelle
for (var i = 0; i < modelStateErrors.length; i++) { $('span[data-valmsg-for="' + modelStateErrors[i].key + '"]').text(modelStateErrors[i].errors[0]); }
Sie sollten Ihre Formulardaten serialisieren und an die Controller-Aktion senden. ASP.NET MVC bindet die Formulardaten
EditPostViewModel
mithilfe der MVC-Modellbindungsfunktion an das Objekt (Ihren Aktionsmethodenparameter).Sie können Ihr Formular auf Clientseite validieren und die Daten an den Server senden, wenn alles in Ordnung ist. Die
valid()
Methode wird sich als nützlich erweisen.quelle
Hier ist eine ziemlich einfache Lösung:
In der Steuerung geben wir unsere Fehler folgendermaßen zurück:
Hier sind einige der Client-Skripte:
So gehen wir mit Ajax um:
Außerdem rendere ich Teilansichten über Ajax folgendermaßen:
RenderRazorViewToString-Methode:
quelle
PartialView
, um es an Ajax zu rendern?Der von @Andrew Burgess bereitgestellten Lösung wurde etwas mehr Logik hinzugefügt. Hier ist die vollständige Lösung:
Erstellt einen Aktionsfilter, um Fehler für Ajax-Anforderungen zu erhalten:
Der Filter wurde zu meiner Controller-Methode hinzugefügt als:
Ein allgemeines Skript für die JQuery-Validierung wurde hinzugefügt:
Schließlich wurde die Fehler-Javascript-Methode zu meinem Ajax-Startformular hinzugefügt:
quelle
Sie können es so machen:
( Bearbeiten: In Anbetracht dessen, dass Sie auf eine Antwort
json
mit wartendataType: 'json'
).NETZ
JS:
Wenn Sie brauchen, kann ich Ihnen auch erklären, wie es geht, indem Sie einen Fehler 500 zurückgeben und den Fehler im Ereignisfehler (Ajax) erhalten. In Ihrem Fall kann dies jedoch eine Option sein
quelle