Asp.Net – Web Api – MVC – Model Validation
Merhabalar , Bu yazımızda Model Validation konusudan bahsedecğim , Model validation aslında mvc de olan bir yapı web api ye özel bir özellik değildir , mvc deki mantık ile aynıdır .
Modellerimiz deki alanlara eklediğimiz Annatation lar ile bu kontrolleri sağlamaktayız . Bu işlemi yapmamızı sağlayan System.ComponentModel.DataAnnotations sınıfıdır.
using e bu sınıfı eklediğimizde modelimizde annotation ları kullanabiliriz.
Örnek Model:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
namespace ModelValidationExample.Models
{
public class User
{
[Required]
[StringLength(50, ErrorMessage = "Adınız en falza 50 karakter olabilir", MinimumLength = 3)]
public string FirstName { get; set; }
[Required]
[StringLength(50, ErrorMessage = "Soyadınız en falza 50 karakter olabilir", MinimumLength = 3)]
public string LastName { get; set; }
[Required]
[EmailAddress]
public string Email { get; set; }
[Required]
[StringLength(15, ErrorMessage = "Adınız en falza 15 karakter olabilir", MinimumLength = 6)]
[RegularExpression(@"/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&.])[A-Za-z\d$@$!%*?&.]{6, 15}/",
ErrorMessage ="En az 1 büyük, 1 küçük, 1 özel karakter ve en falza 15 karakter giriniz.")]
public string Password { get; set; }
[Required]
[Compare("Password",ErrorMessage ="Şifre bilginizi kontrol ediniz.")]
public string ConfirmPassword { get; set; }
[Required]
[Range(18,100,ErrorMessage ="Yaş aralığı 18 ile 100 arasındadır.")]
public int BirthYear { get; set; }
[CreditCard]
public string CreditCard { get; set; }
[Url]
public string FacebookProfileUrl { get; set; }
[Required]
[Phone]
public string Phone { get; set; }
}
}
ASP.NET MVC’deki Bazı Annotation Tipleri ve Açıklamaları :
Required
Bu özellik, değerin zorunlu olduğunu ve atlanamadığını belirtir.
Syntax:[Required(ErrorMessage=”Please enter name”),MaxLength(30)]
DataType:Bu özellik modelin veri tipini belirlemek için kullanılır.
Syntax:[DataType(DataType.Text)]
Range:Bu özelliği kullanarak iki sayı arasında bir aralık ayarlayabiliriz.
Syntax:[Range(100,500,ErrorMessage=”Lütfen uygun değer giriniz.“)]
Compare:Bu özelliği kullanarak giriş yapılan alan ile farklı bir alanın değerlerinin aynı olup olmadığı kontrol edilir.
Syntax:[Compare(“Password”,ErrorMessage =”Şifre bilginizi kontrol ediniz.”)]
Tırnak içinde yazılan ilk alanda eşleştirilecek alan belirtilen
StringLength:Bu özelliği kullanarak stringin maksimum ve minimum uzunluğunu belirleyebiliriz.
Syntax:[StringLength(30,ErrorMessage=”30 karakterden fazla giremezsiniz!”)]
DisplayName:Bu özelliği kullanarak, görünümde görüntülenecek özellik adını belirtebiliriz.
Syntax:[Display(Name=”Öğrenci Adı”)]
MaxLength:Bu özelliği kullanarak maksimum özellik uzunluğu belirleyebilirsiniz.
Syntax:[MaxLength(3)]
Bind:Bu özellik, model bağlama için dahil edilecek veya hariç tutulacak alanları belirtir..
Syntax:[Bind(Exclude = “StudentID”)]
DisplayFormat:Bu özellik, niteliğe göre belirtilen biçimde tarih belirlememize izin verir.
Syntax:[DisplayFormat(DataFormatString = “{0:dd.MM.yyyy}”)]
RegularExpression:Regex formatı kullanılabilir Örn: Email ID.
Syntax:[RegularExpression(@”^\w+([-+.’]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$”, ErrorMessage = “Email is not valid.”)]
Validasyon ların 3 Farklı kullanım Şeklimiz var:
- Model State
- Validation Model Attribute
- Validation Model Filter

- Model State : ModelState.IsValid kontrolü ile bool bir değer dönmektedir , true ise hatasız false ise model e uygun olmayan değerlerin olduğu belirtilir.
Örnek :
using ModelValidationExample.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
namespace WebApiApp.Controllers
{
public class UserController : ApiController
{
[HttpPost]
public HttpResponseMessage Post([FromBody] User user)
{
if (ModelState.IsValid)
{
return Request.CreateResponse(HttpStatusCode.Created, "Kullanıcı oluşturuldu.");
}
else
{
List<string> erroList = ModelState.Values.SelectMany(x => x.Errors).Select(v => v.ErrorMessage).ToList();
string errorMessage = string.Join(Environment.NewLine , erroList);
return Request.CreateResponse(HttpStatusCode.BadRequest, errorMessage);
}
}
}
}
Hata aldığında hatalı alanları responseta dönecek şekilde örnek bir kod.
- Validation Model Attribute : Model Statteki gibi her seferinde bu kodu yazmak yerine bunu bir FilterAttribute haline getirip controllerımız tanımlayıp aynı şekilde uygulayabiliriz .

Ekran görüntüsündeki gibi bir Filters kalsörü oluşturdum içine MyModelValidationAttribute adında bir sınıf ekledim , bu sınıfı bir attribute olarak kullanabilmek için ActionFilterAttribute sınıfından miras aldım.
MyModelValidationAttribute.cs :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
namespace WebApiApp.Filters
{
public class MyModelValidationAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (actionContext.ModelState.IsValid)
{
base.OnActionExecuting(actionContext);
}
else
{
var errorList = actionContext.ModelState.Values.SelectMany(v => v.Errors)
.Select(x => x.ErrorMessage).ToList();
var errorMessage = string.Join(Environment.NewLine, errorList);
actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, errorMessage);
}
}
}
}
Kullanım için Controller Örnek Kod :
using ModelValidationExample.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using WebApiApp.Filters;
namespace WebApiApp.Controllers
{
[MyModelValidation]
public class UserController : ApiController
{
[HttpPost]
public HttpResponseMessage Post([FromBody] User user)
{
return Request.CreateResponse(HttpStatusCode.Created, "Kullanıcı oluşturuldu.");
}
}
}
- Validation Model Filter :
Yazmış olduğumuz filter ı WebApiConfig.cs te filter olarak tanımlar isek global bir filter olarak kullanabilir ve Controllerın başına bu attribut ü her seferinde tanımlamak zorunda kalmayız :
WebApiConfig.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using WebApiApp.Filters;
namespace WebApiApp
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Filters.Add(new MyModelValidationAttribute());
}
}
}
config olarak bu filter ı eklediğimizde artık Controller da attribute ü yazmamıza gerek kalmamaktadır.
UserController.cs:
using ModelValidationExample.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
namespace WebApiApp.Controllers
{
public class UserController : ApiController
{
[HttpPost]
public HttpResponseMessage Post([FromBody] User user)
{
return Request.CreateResponse(HttpStatusCode.Created, "Kullanıcı oluşturuldu.");
}
}
}
Genel olarak model validationlar bu şekilde kullanılmaktadır.

