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.