Vamos a ver un filtro que nos permitirá validar el modelo del mismo modo que lo solemos hacer en ASP MVC.

En ASP MVC la validación de nuestros modelos viene facilitada en gran medida por la gestión que podemos hacer en los controladores del ModelState

[HttpPost]
public ActionResult SaveModel(MyModel model)
{
    if(ModelState.IsValid)
    {
        // Guardar en la BBDD
        return View("ModelSaved");
    }
    return View();
}

Si el ModelState es inválido se retornará la misma vista y se mostrarán los errores de validación que estemos gestionando en la misma mediante los HTML Helpers correspondientes.

En la Web API la cosa no es tan sencilla y tendremos que trabajar un poco más. Lo normal es desarrollar un filtro con el que decorar nuestros métodos y retornar los errores de validación que se hayan producido. El filtro es muy sencillo y nos valdría simplemente con algo así:

public class ModelValidationAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (actionContext.ModelState.IsValid == false)
        {
            // Devuelve los errores de validación
            var errors = new Dictionary<string, IEnumerable<string>>();
            foreach (KeyValuePair<string, ModelState> keyValue in actionContext.ModelState)
            {
                errors[keyValue.Key] = keyValue.Value.Errors.Select(e => e.ErrorMessage);
            }
 
            actionContext.Response =
                actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, errors);
        }
    }
}

Ahora tendremos que decorar nuestros métodos o incluso el contralador de la web api al completo con este filtro para que se aplique de forma correcta.

Por tanto, cuando hagamos una petición ajax desde nuestro cliente sobre la web api, ya podremos gestionar dichos errores de validación mediante, por ejemplo, algo así …

$.post("api/", credential)
	.done(function (result) {
        // Todo ha ido bien
	})
	.fail(function (errors) {
	    // Se han producido errores de validación y se ha retornado un 400. Bad request con los errores
        if (errors.responseText != "") {
             $.each($.parseJSON(errors.responseText), function (key, value) {
                console.log(value);
             });
        } else {
             console.log(errors.statusText);
        }
	});

Listo, con esto ya tenemos la misma funcionalidad que en ASP MVC

Hasta pronto!!