2015-03-03 3 views
12

ich eine Form haben, die zusammen mit einer Validierung Zusammenfassung unaufdringlich JQuery Validierung verwendet. Es funktioniert großartig. Dieses Formular führt jedoch einen Ajax-POST aus, der ein JSON-Ergebnis zurückgibt. Wenn das Ergebnis == wahr ist, fahre ich fort. Wenn das JSON-Ergebnis jedoch ein Array von Nachrichten zurückgibt, möchte ich die Formularvalidierung auslösen, um die Felder zu aktualisieren. Fehler zurückgegeben werden, wie folgt:Without a Key

{ 
    "errors": [ 
     { "key" : "NameFirst", "message": "This is the message" }, 
     { "key" : "NameLast", "message": "This is the message" } 
    ] 
} 

ich das JSON Ergebnis analysieren und rufen errors() wie folgt:

for (var j = 0; j < response.errors.length; j++) { 
    var key = response.errors[j].key; 
    var error = {}; 
    error[key] = response.errors[j].message; 
    $form.data('validator').showErrors(error); 
} 

Dies korrekt die Felder markiert sind, aber nicht die Validierung Zusammenfassung aktualisieren. Wie kann ich das aktualisieren?

Auch, manchmal sind die Fehler generisch und ordne nicht auf eine bestimmte Eigenschaft/Feld im Modell. In diesem Fall werden sie mit null Schlüssel zurückgegeben wie:

{ 
    "errors": [ 
     { "key" : null, "message": "This is the message" }, 
     { "key" : null, "message": "This is the other message" }, 
     { "key" : "NameFirst", "message": "This is the message" }, 
     { "key" : "NameLast", "message": "This is the message" } 
     ] 
} 

ich errors auf diejenigen, die nicht anrufen können, weil sie nicht auf eine Feldkennung zuzuordnen. Sobald ich gesagt, wie die Zusammenfassung zu aktualisieren, ich sicher kann ich Elemente in die Liste für die generischen Nachrichten anhängen, aber ich bin für andere Vorschläge offen. Vielen Dank!

UPDATE

Hier ist, was ich tun, endete das ganz gut zu funktionieren scheint. Ich habe die Zusammenfassung von Hand zusätzlich zu fordern errors auf den gültigen Schlüssel Fehler bauen:

var $summary = $form.find("[data-valmsg-summary=true]") 
        .addClass("validation-summary-errors") 
        .removeClass("validation-summary-valid"); 
var $ul = $summary.find("ul").empty(); 

var error = {}; 
$.each(response.errors, function() { 
    if (this.key) 
     error[this.key] = this.message; 
    $("<li />").html(this.message).appendTo($ul); 
}); 
$form.validate().showErrors(error); 

Ich hoffe, das anderen hilft.

Antwort

0

lief ich in das gleiche Problem und nicht eine sauberere Art und Weise herausfinden konnte. Dies ist, was die ich denke

tun

anstelle dieses

for (var j = 0; j < response.errors.length; j++) { 
    var key = response.errors[j].key; 
    var error = {}; 
    error[key] = response.errors[j].message; 
    $form.data('validator').showErrors(error); 
} 

dieses Stoßen,

 var error = {}, keyLess = 0; 

     for (var j = 0; j < response.errors.length; j++) { 
      var key = response.errors[j].key; 
      error[key || keyLess++] = response.errors[j].message; 
     } 

     $form.validate().showErrors(error); 

     var container = $form.find("[data-valmsg-summary=true]"), 
      list = container.find("ul"); 

     if (list && list.length) { 
      list.empty(); 
      container 
       .addClass("validation-summary-errors") 
       .removeClass("validation-summary-valid"); 

      $.each(error, function(k,m) { 
       $("<li />").html(m).appendTo(list); 
      }); 
     } 

Dies ist im Grunde, was jQuery.validate.unobtrusive tut

Was tun Sie denken?

+0

Das ist fast genau das, was ich getan habe. ShowErrors() löst jedoch eine Ausnahme aus, wenn ein Schlüssel nicht einem Feldnamen zugeordnet ist. Es scheint ein Null-Element zu passieren, das am Ende versucht, highlight() aufzurufen, was zu einem Fehler führt, dass die Eigenschaft "Eigenschaft nicht lesen" nicht erkannt werden kann. Daher kann ich Ihren keyLess Incrementor nicht verwenden. Ich werde meinen Beitrag mit etwas Ähnlichem aktualisieren. Ich füge grundsätzlich alle Fehler zum UL hinzu, aber füge dem Fehlerobjekt nur gültige Schlüsselfehler hinzu. –

2

Ich brauchte meine eigene benutzerdefinierte Fehlermeldungen in die Übersichtsliste hinzuzufügen. Nach einem Tag oder so durchlesen hier die jQuery Validierung und unaufdringlich Validierung Quellcode ist die Lösung, die ich am Ende mit.

Zuerst erklärte ich meine Form

@using (Html.BeginForm(null, null, FormMethod.Post, new {id = "formA"})) 
{ 
    @Html.ValidationSummary() 
      ..... 
      ..... 

die ID-Einstellung ist wichtig, da ich diese ID in den JavaScript-Code verwenden Sie das Formular-Objekt abzurufen. Diese

$(function() { 
    var formValidator, 
     $form = $("#formA"); 

    // add handler to the forms submit action 
    $form.submit(function() { 
     if (!formValidator) { 
      formValidator = $form.validate({}); // Get existing jquery validate object 
     } 

     var errorList = []; 

     // get existing summary errors from jQuery validate 
     $.each(formValidator.errorList, function (index, errorListItem) { 
      errorList.push(errorListItem.message); 
     }); 

     // add our own errors 
     if (testForErrorCondidtionA()) { 
      errorList.push("Please fix error condition A!"); 
     } 

     if (testForErrorCondidtionB()) { 
      errorList.push("Please fix error condition B!"); 
     } 

     // No errors, do nothing 
     if (0 === errorList.length) { 
      return true; // allow submit 
     } 

     // find summary div 
     var $summary = $form.find("[data-valmsg-summary=true]"); 

     // find the unordered list 
     var $ul = $summary.find("ul"); 

     // Clear existing errors from DOM by removing all element from the list 
     $ul.empty(); 

     // Add all errors to the list 
     $.each(errorList, function (index, message) { 
      $("<li />").html(message).appendTo($ul); 
     }); 

     // Add the appropriate class to the summary div 
     $summary.removeClass("validation-summary-valid") 
      .addClass("validation-summary-errors"); 

     return false; // Block the submit 
    }); 
}); 

einreichen Handler wird immer dann aufgerufen, nachdem die unauffällige Handler

verwendete ich den folgenden Code, um die Zusammenfassung Fehlerliste zu aktualisieren, auf

einreichen, was bedeutet die Zusammenfassung Fehlerliste wir von jQuery Validate abrufen wird immer sein miteinander ausgehen.

Hoffe, diese Antwort hilft, da eine unauffällige Validierung haarig werden kann, sobald Sie sich vom Standardfall (s) entfernt haben.

0
if (!formValidator) { 
     formValidator = $form.validate({}); // Get existing jquery validate object 
    } 

    // get existing summary errors from jQuery validate 
    $.each(formValidator.errorList, function (index, errorListItem) { 
     errorList.push(errorListItem.message); 
    }); 

    // add our own errors 
    if (testForErrorCondidtionA()) { 
     errorList.push("Please fix error condition A!"); 
    } 

    //unobtrusiveValidation should do the ul/summary dirty work. 
    $form.trigger('invalid-form.validate', formValidator); 
+3

Willkommen bei Stack Overflow! Bitte fügen Sie eine Erklärung hinzu, warum dieser Code dem OP hilft. Dies wird helfen, eine Antwort zu liefern, von der zukünftige Zuschauer lernen können. Weitere Informationen finden Sie unter [Antwort]. –

+0

@Sumguy Hallo Ich habe deine Lösung versucht, aber ich habe errorList auf der zweiten Schaltfläche senden. Bitte sehen Sie meine Frage hier http://stackoverflow.com/questions/39833727/validation-errorlist-comes-on-second-submit-click-of-form, damit Sie es besser verstehen können. –

0

MVC 5 Fehler Clearing-Verfahren (etwas anders als oben):

function resetValidation() { 
    var form = $('#formName'); 
    var summary = form.find('[data-valmsg-summary=true]'); 
    var ul = summary.find('ul'); 
    ul.empty(); 
    summary.removeClass('validation-summary-errors').addClass('validation-summary-valid'); 
} 

Viel Spaß!