MVC4 WebAPI und knockoutjs – Teil 2 – Validation


Auch wenn man die WebApi benutzt und AJAX Requests ausführt ist es problemlos möglich die Modelvalidierung von MVC zu benutzen. Dafür müssen wir den View wie bisher erstellen und z.B. auf Attribute wie “Required” in unserem Model zurückgreifen.

Im View muss weiterhin “ValidationMessageFor” für das jeweilige Eingabefeld verwendet werden.

</pre>
<div class="control-group">@Html.LabelFor(model => model.Vorname, new { @class = "control-label" })
<div class="controls">@Html.TextBoxFor(model => model.Vorname, new { data_bind = "value: Vorname" }) @Html.ValidationMessageFor(model => model.Vorname)</div>
</div>
<pre>

Um die native Model Validierung von MVC auszuführen/anzuzeigen, gibt es zwei Möglichkeiten.

1. Validierung für alle Requests automatisch einstellen.

Für diese Variante muss ein FilterAttribut erstellt werden und global für alle WebApi Aufrufe registriert werden.

 /// 
 /// ValidationAttribute für WebApi Zugriffe die nicht valide sind.
 /// 
 public class ValidateAttribute : ActionFilterAttribute
 {
     public override void OnActionExecuting(HttpActionContext actionContext)
     {
         if (!actionContext.ModelState.IsValid)
         {
             actionContext.Response = actionContext.Request.CreateErrorResponse(
                 HttpStatusCode.BadRequest,
                 actionContext.ModelState);
         }
     }
 } 

Registrieren des ValidateAttribute, wird bei mir vor dem Registrieren der Routen gemacht

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        //Registrieren unseres Filters für die Modelvalidation für AJAX Requests
        config.Filters.Add(new ValidateAttribute());

        ......

Wenn jetzt ein AJAX Request mit mit einem “Aktuellen” Model stattfindet z.b. mit “Required” Attribute werden die Fehlermeldungen im Webformular angezeigt und es werden keine Daten am Controller auf dem Server “ankommen”. Es wird vom Server ein StatusCode 400 zurückgegeben, der bei Bedarf auch noch ausgewertet werden kann.

2. Validierung nur für bestimmte Controllerfunktionen durchführen.

Hier wird kein ValidateAttribute angelegt, sondern direkt in der jeweiligen Controllerfunktion eine HttpResponseException ausgelöst, wenn das Model nicht valide ist. Anhand dieser Exception, weiß der Client auch das er einen Fehler anzeigen soll.

public PersonModel Save(PersonModel value)
{
    if (ModelState.IsValid)
    {
        if (value == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }

        //Gibt den Statuscode 200 für OK zurück!
        value.Id = 5;
        return value;
    }

    throw new HttpResponseException(HttpStatusCode.BadRequest);
}

Codeplex:

https://squadwuschel.codeplex.com/

Dann unter “Source Code” –> “Browse” –> “Testprojekte” –> “Mvc4WebApiKoTb” hier dann die Wichtigsten Dateien im Webprojekt unter “Views/Home/Person.cshtml”, “App_Start/WebApiConfig.cs”, “Controllsers/PersonEditApiController.cs” und “Helpers/Filters/ValidateAttribute.cs”

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s