2011-01-14 8 views
20

Ich habe mit dem neuen MVC3 Json Model Binding gespielt und es ist ganz nett.ASP.Net MVC 3 JSON Modell Binding und serverseitige Modellvalidierung gemischt mit clientseitiger Validierung

Zur Zeit kann ich JSON zum Controller posten und binden. Die Modellvalidierung erfolgt ebenfalls gut.

Aber was passiert, wenn das Modell ungültig ist?

Ich mag würde JSON zurückzukehren und die Client-Seite haben den Benutzer benachrichtigen (wie, wie Sie normale Client-seitige Validierung in mvc führen würde)

Kennt jemand einige Anleitungen, wie diese durchführen?

Ist das überhaupt möglich?

Oder gibt es Frameworks, die ich dazu nutzen kann?

+0

Wie Mitteilung verfassen Sie diese JSON? Benutzt du AJAX? –

+0

Ja, über Ajax posten –

+0

@TheCodeKing Sie verlinken zurück zu dieser Frage? –

Antwort

25

Das folgende Beispiel funktioniert für mich bei der Verwendung von unaufdringlichem JavaScript in MVC3. Ich mache etwas sehr ähnliches. Angesichts der folgenden JsonResponse Klasse:

public enum Status 
{ 
    Ok, 
    Error 
} 

public class JsonResponse 
{ 
    public Status Status { get; set; } 
    public string Message { get; set; } 
    public List<string> Errors { get; set; } 
} 

Mein Controller kann somit eine Methode:

[HttpPost] 
public ActionResult Login(UserLoginModel model) 
{ 
    JsonResponse res = new JsonResponse(); 

    if (!ModelState.IsValid) 
    { 
     res.Status = Status.Error; 
     res.Errors = GetModelStateErrorsAsString(this.ModelState); 
     res.Message = "Oh dear, what have you done. Check the list of errors dude!"; 
    } 
    else 
    { 
     // Save it here... 

     // Return success 
     res.Status = Status.Ok; 
     res.Message = "Everything was hunky dory"; 
    }    

    return Json(res); 
} 

Und die Modelstate kann für die Fehler wie so aufgezählt werden:

private List<string> GetModelStateErrorsAsString(ModelStateDictionary state) 
{ 
    List<string> errors = new List<string>(); 

    foreach (var key in ModelState.Keys) 
    { 
     var error = ModelState[key].Errors.FirstOrDefault(); 
     if (error != null) 
     { 
      errors.Add(error.ErrorMessage); 
     } 
    } 

    return errors; 
} 

Da ist in meinem Ansicht Ich kann den folgenden JSON POST haben:

<script type="text/javascript"> 
$("form").submit(function (evt) { 
    // validate 
    $('form').valid(); 

    // extract values to submit   
    var form = $(this), 
     username = form.find("[name=Username]").val(), 
     password = form.find("[name=Password]").val(), 
     json = JSON.stringify({ 
      Username: username, 
      Password: password 
     }); 

    $.ajax({ 
     url: form.attr("action"), 
     type: 'POST', 
     contentType: 'application/json; charset=utf-8', 
     dataType: 'json', 
     data: json, 
     success: function (result) { 
      alert(result.Message); 
     } 
    }); 

    // stop form submitting 
    evt.preventDefault(); 
}); 
</script> 

Ich verwende jQuery.tmpl, um die Fehler anzuzeigen. Ich habe das jedoch von diesem Beispiel ausgeschlossen.

+2

cheers für die Antwort .. Ich kann das im Moment nicht ganz testen, wie ich im Urlaub bin. Ich hoffe, es macht dir nichts aus, wenn ich das offen lasse, bis ich zurückkomme. –

+0

@Junto Warum nicht einen boolean anstelle einer enum verwendet? – Rushino

+1

@Rushino Sie können die Aufzählung erweitern, um z. B. Warnungen oder Informationen einzubeziehen. Boolean begrenzt dich. – Junto

1

Danke für diese Lösung. Ich habe es ein wenig verbessert, indem ich ein Wörterbuch weitergegeben habe, so dass Sie das unauffällige Javascript verwenden können, um die Validierung auf die einzelnen Felder statt einer Zusammenfassung durch Bezugnahme auf den Schlüssel des Wörterbuchs zu setzen.

private Dictionary<string, string> GetModelStateErrorsAsString(ModelStateDictionary state) 
    { 
     Dictionary<string, string> errors = new Dictionary<string, string>(); 
     foreach (var key in ModelState.Keys) 
     { 
      var error = ModelState[key].Errors.FirstOrDefault(); 
      if (error != null) 
      { 
       errors.Add(key, error.ErrorMessage); 
      } 
     } 
     return errors; 
    } 
+4

Ich frage mich eigentlich, wie binden Sie die Fehler von JSON an Ihr Formular auf der Client-Seite - könnten Sie bitte erklären? – mb666

0

@Junto und @ Jamey777, Sie beide übergeben Sie das Model auf Ihre Funktion Fehler, aber dann verwenden Sie die globale Variable anstelle des Parameters.

und warum nicht verwenden Sie nur ein wenig Linq wie

private Dictionary<string, string> GetModelStateErrorsAsString() 
    { 
     return ModelState.Where(x=> x.Value.Errors.Any()) 
      .ToDictionary(x => x.Key, x => x.Value.Errors.First().ErrorMessage); 
    } 
Verwandte Themen