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

screenshot_1

  • 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 .

screenshot_2

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.

Print Friendly, PDF & Email

You may also like...

Bir cevap yazın