Dies ist ein Follow-up zu einer previous question, die ich zuvor über die Übergabe eines Fehlers zurück an den Client hatte, sondern bezieht sich auch auf den ModelState.In ASP.Net MVC kann ModelState mit einem Ajax-Update verwendet werden?
Hat jemand erfolgreich den Nerd Dinner-Ansatz verwendet, aber mit Ajax? Also macht Nerd Dinner ein Update als so.
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection formValues)
{
Dinner dinner = dinnerRepository.GetDinner(id);
try
{
UpdateModel(dinner);
dinnerRepository.Save();
return RedirectToAction("Details", new { id=dinner.DinnerID });
}
catch
{
foreach (var issue in dinner.GetRuleViolations()) {
ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
}
return View(dinner);
}
}
jQuery $ .ajax
function hijack(form, callback, errorFunction, format) {
$.ajax({
url: form.action,
type: form.method,
dataType: format,
data: $(form).serialize(),
success: callback,
error: function(xhr, textStatus, errorThrown) {
errorFunction(xhr, textStatus, errorThrown);
}
});
}
Ajax verwenden, die "versuchen" Teil der Steuerung wird
try
{
UpdateModel(dinner);
dinnerRepository.Save();
return PartialView("PartialDetails", new { id=dinner.DinnerID });
}
, aber was tun Sie, um die Klinke?
Eine einfache Fehlerbehandlung Lösung
catch(Exception ex)
{
Response.StatusCode = 500;
return Content("An Error occured.");
//throw ex;
}
, aber die nicht durch das robuste Model in MVC gebaut passieren wäre ein Fehler zurück zu senden. Ich dachte an eine Reihe von Optionen, aber ich möchte wirklich 2 Dinge:
- Ich möchte den Fehler in jQuery Fehler Attribut behandelt werden.
- Ich möchte integrierte ASP.Net MVC-Prüflogik so viel wie möglich verwenden.
Ist das möglich? Wenn nicht, welche sind die besten Alternativen, die Sie kennen?
Vielen Dank.
Update Ich habe dies noch nicht als beantwortet markiert, weil ich noch nicht implementiert habe, was ich denke, wird am besten funktionieren.
Ich habe entschieden, dass ich den Erfolg nicht wirklich mag => aktualisierte Liste senden, Fehler => sende Fehlermeldung Ansatz, den ich nahm. Ich habe dies getan, um die Anzahl der Anrufe zu reduzieren, aber eine aktualisierte Liste wird wirklich auf die Seite gesetzt. Der Versuch, beides zu tun, bindet das Popup an seine gesamte Seite.
Ich werde ein benutzerdefiniertes jQuery-Ereignis hinzufügen, um die Masterseitenliste zu aktualisieren, wenn das Dialogfeld geschlossen wird. Im Wesentlichen ist es das Beobachtermuster. Ich mag die Idee, dass die Seite zum Popup sagt "Sag mir, wenn du fertig bist" (aka geschlossen), ohne das Popup warum zu sagen. Es erfordert einen zusätzlichen Anruf, aber ich sehe das nicht als großes Problem.
Ich bin mir immer noch nicht sicher, wie gut, dass ich serverseitige Validierung mag/nicht mag und ich erwäge, mit der clientseitigen Validierung zu gehen. Während serverseitige Validierung scheint wie saubere Schichtung, hat es auch eine Reihe von Problemen, einschließlich:
1) Es setzt Qualitätschecks am Ende, anstatt des Anfangs. Eine Analogie zur Herstellung wäre ein Auto, das getestet wird, wenn es beim Händler ankommt, statt an den Stellen, an denen es gebaut wird.
2) Es verletzt die Absicht von Ajax. Bei Ajax geht es nicht nur darum, asynchrone Ereignisse zu senden, es geht auch darum, nur das zu senden, was ich brauche, und nur das zu empfangen, was ich brauche. Das Zurücksenden des gesamten Modellstatus, um Fehlerdetails bereitzustellen, scheint nicht mit Ajax zu gehen.
Was ich darüber denke, ist clientseitige Validierung, aber dieser Servercode und ein benutzerdefiniertes Ansichtsmodell können verwendet werden, um dem Client mitzuteilen, wie diese Validierungsregeln dynamisch erstellt werden.
Ich vermute auch, dass eine dynamische Sprache wie IronRuby oder IronPython einen eleganteren Weg bieten könnte, um diese Probleme zu lösen, aber es könnte etwas länger dauern, bevor ich auf diese Möglichkeit eingehe.
Nun ich denke, es hängt wirklich vom Szenario ab, wenn 2 Anfrage ist kein Problem, ich werde dafür gehen.Persönlich eine Menge Validierung mit JavaScript auf der Client-Seite zu tun ist nicht etwas, das ich liebe (ich weiß nicht warum, aber ich sehe js wie etwas nicht sehr vertrauenswürdig/sicher/gleichermaßen implementiert (in diesem einen jquery speichern den Tag)), speziell weil manchmal kann man nicht alle Validierungen auf der Client-Seite, Sie müssen eine Art von Sever Side-Checks, wie (diese Entität ist bereits in der DB?), und unterstützen js deaktivierte Clients, aber wie ich es zu Beginn gesagt hängt vom Szenario ab. – JOBG
Ich stimme zu, dass Sie nicht alle Validierung auf der Client-Seite tun können, scheint es nur wie das Validierungs-Framework scheint hauptsächlich auf Feldfehler ausgerichtet (zu lange, kein Datum, etc.). Zumindest in den Beispielen, die ich gesehen habe. Wenn Sie Benutzereingaben überprüfen, scheint Javascript der geeignete Ort für die Überprüfung zu sein. – John
Ich habe mich entschlossen, zwei Anrufe zu tätigen, anstatt nur eine, weil die Detailansicht aus der darunter liegenden Seitenansicht entfernt wird. Ich möchte, dass das Popup zur Seite "Ich bin geschlossen" zurücksagt, aber nichts darüber weiß, was die Seitenansicht bewirken wird. jQuery sollte dies ohne viel Aufwand ermöglichen. Dadurch kann ich mir keine Sorgen darüber machen, dass Änderungen an meiner Detailansicht die Seite beeinflussen und umgekehrt. – John