SelamünAleyküm, geçtiğimiz yazıda Model Binding'in ikinci yazısını ve Modelde Belirli alanları konusunu ele alıyorduk. Bu yazıda ise "Model Binding Attributes" ve "Custom Model Binding Attributes" üzerinden devam edeceğiz.
Modelimize Attribute olarak BindRequired yazdğımızda bu alanın gerekli olduğunu vakit bize aktarmaktadır ve bu alan dolmazsa ModelState.IsValid False olarak dönmekte.
public class ModelBindingConroller : Controller
{
public IActionResult BindRequiredExp(QueryParameters queryParameters)
{
if(ModelState.IsValid)
{
return Ok(new[]
{
queryParameters.X, queryParameters.Y
});
}
return BadRequest();
}
public class QueryParameters
{
[BindRequired]
public int X { get; set; }
public int Y { get; set; }
}
}
Gördğümüz kod bloğunda X alanının dolup dolmama durumuna göre geriye bir durum kodu döndürüyoruz.
https://localhost:44313/ModelBinding/BindRequiredExp Url'i ile request'te bulunduğumuzda 400 durum kodunu bize döner.
https://localhost:44313/ModelBinding/BindRequiredExp?x=47 Url'i ile request'te bulunduğumuzda 200 durum kodunu bize döner ve sonuçları ekrana basar.
Modelimize ait bir alanın doldurulmasını istemiyorsak BindNever Attribute'sini kullanırız.
public class ModelBindingConroller : Controller
{
public IActionResult BindRequiredExp(QueryParameters queryParameters)
{
if(ModelState.IsValid)
{
return Ok(new[]
{
queryParameters.X, queryParameters.Y
});
}
return BadRequest();
}
public class QueryParameters
{
[BindNever]
public int X { get; set; }
public int Y { get; set; }
}
}
https://localhost:44313/ModelBinding/BindRequiredExp?x=47&y=24 → Url'i ile request'te bulunduğumuzda X kısmına 0 ve Y kısmına 24 değerini ekrana bastı. Bunun nedeni X property'sine BindNever Attribute'sini yazmış olmamızdır.
İsteğimizin Header bilgisi lie veriyi alacağımızı gösterir.
public class ModelBindingConroller : Controller
{
public IActionResult FromHeader([FromHeader]string accept)
{
return Ok(new[] { accept });
}
}
İsteğin Header bilgilerinden accept bilgisini alıp ekrana yazdık.
FromServices Attributes'i sayesinde, Controller katmanındaki Action metodunda interface'elrimizden bir adet oluşturup metotlarımıza erişim sağlayabiliriz.
NewsServices isimli bir class'ımız olsun ve bu class INewsService simli Interface'den miras alsınve bu class'ın Validate isimli bir metodu olsun.
public interfave INewsService
{
bool Validate(int NewsId);
}
public class NewsService : INewsService
{
public bool Validate(int NewsId)
{
return true;
}
}
Bu class'ı ve Interface'imizin, Startup.cs içersinideki ConfigureServices metodu içinde tanımlamasını yapalım.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddScoped<INewsService, NewsService>();
}
Şimdi bu class'ı Action metodumuzda paramtere olara yazalım ve FromServices Attribute tanımlamasını yapalım.
public IActionResult Get([FromServices] INewsService _newsService, [FromQuery]int NewsId)
{
return Ok(_newsService.Validate(NewsId));
}
https://localhost:44313/ModelBinding/Get?NewsId=7 Url'i ile istekte bulunduğumuzda bağımlılıktan kurtardığımız Validate, Get isimli Action metodunda sorunsuz olarak çağırmış olacağız.
Ayrıca Constructor tanımlamadan ve Interface'mizden bir tane oluşturmadan NewsService içindeki metotlarımıza erişim sağlamış olduk.
İsteğimizin body kısmında göndermek istediğimiz veriyi Action metoduna gönderebiliriz.
Not: | Biz bu örnekte isteğimizin body tarafını doldurmak için Postman programından destek alacağız. Sizde istersenis Postman veya farklı bir program aracılığı ile örenğimizi yapabilirsiniz. |
public class ModelBindingConroller : Controller
{
[HttpPost]
public IActionResult FromBody([FromBody]FromBdyModel fromBodyModel)
{
return Ok(new[]
{
fromBodyModel.X, fromBodyModel.Y
});
}
public class FromBdyModel
{
public int X { get; set; }
public int Y { get; set; }
}
}
Postman'da http isteğimizi Post şeklinde ayarladıktan sonra Body sekmesinden veriyi Json olarak gönderdik. Postman da bize 200 durum kodunu dönerek geriye dönen değerleri Json formatında ekrana bastık.
Kendimiz de Model Binding Attribute'leri yazıp onları uygulamamızda kullanabiliriz. Bu şekilde Modelimizle eşleştirmek istediğimiz alanları yeni özellikler getirip o şekilde eşleştirme yapabiliriz.
Misalen, kullanacağımız modelimizi yazalım.
public class CustomViewModel
{
public string NameSurname { get; set; }
}
CustomModelBinder adında bir class'ımız olsun ve bu class IModelBinder Interface'inden miras alsın. url'den name parametresini alsın ve bu parametrenin sonuna "Bozkuş" string ifadesini ekledikten sonra NameSurname property'sine atansın.
public class CustomModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
var name = bindingContext.ActionContext.HttpContext.Request.Query["name"];
var result = new CustomViewModel
{
NameSurname = name + " Bozkuş"
};
bindingContext.Result = ModelBindingResult.Success(result);
return Task.CompletedTask;
}
public class CustomModelBinderProvider : IModelBinderProvider
{
public IModelBinder GetBinder(ModelBinderProviderContext context)
{
if (context.Metadata.ModelType == typeof(CustomViewModel))
return new CustomModelBinder();
return null;
}
}
}
Custom olarak oluşturduğumuz Model Binding işleminin Startup class'ı içerisindeki ConfigureServices metodu içinde tanımlanmasını yapalım.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews(config => config.ModelBinderProviders.Insert(0, new CustomModelBinderProvider()));
}
//Şimdi Custom olarak oluşturduğumuz Model Binding işlemini Action metodunda kullanalım.
public string Get([ModelBinder(BinderType = typeof(CustomModelBinder))]CustomViewModel viewModel)
{
return viewModel.NameSurname;
}
projemizi çalıştıralım.
Görüldüğü gibi Query String'in name alanına sadece "Hasan" yazdık, ancak Custom olarak oluşturduğumuz Model Binding Attribute sayesinde sonuna "Bozkuş" ifadesini ekledi. Biz de bunun gibi kurallar belirleyip attribute olarak tanımlayaibiliriz.
Bu şekilde hem bu yazımızın sonuna hem de Model Binding konusununun tamamını incelemiş olduk. İlgili konuya ait projeyi github adresinden bulabilirsiniz. İlgilenenlerin faydalanması ümidiyle.
Asp .Net Core SignalR 3 - SignalR'da Loglama Mekanizması
Devamı OkuYazılım, teknoloji ve daha fazlası için bizi takip edin.
© Techno Guide. Tüm Hakları Saklıdır.
HTML Codex Tasarımıdır.