Asp .Net Core ile Medium Tarzı Blog Sitesi Yapımı-Son Dokunuşlar
Bu yazıda kullanıcı-post ilişkisini kurup, her kullanıcının sadece kendi postunu düzenleyebilmesi gibi ekranları tasarlayacağız.
Öncelikle veri tabanı bağlantısını halletmemiz gerek, bunun için Post sınıfına aşağıdaki satırları ekliyoruz.
[Required]
public IdentityUser user { get; set; }Bu satır post sınıfı ile kullanıcı sınıfı birbirine bağlıyor. Ayrıca Required ile user verisinin boş olmayacağını(not nullable) belirtiyoruz.
Ardından,
add-migration Relationkomutunu veriyoruz. Bu komutun arkasından direk update-database dersek eğer sizde benim gibi sqlite kullanıyorsanız hata alabilirsiniz. Sqlite dosya tabanlı basit bir veritabanı olduğu için diğer veritabanlarında olan birçok özelliği içerisinde barındırmıyor. Ayrıntılı bilgiyi şu linkten bulabilirsiniz.

Yukarıda saydığım sebeplerden ötürü migration işlemi sonuncunda oluşan dosyada sqlite tarafından desteklenmeyen AddForeignKey komutunu siliyor yada görseldeki gibi yorum satırı yapıyoruz. Alternatif olarak veritabanını ve tüm migrationları silip sıfırtan tekrar oluşturarak da yapabilirsiniz.
Bu işlemden sonra
update-databasekomutunu verince post tablosuna userId adında yeni bir alan eklendiğini göreceksiniz.
Veritabanı ilişkileri(n*n, 1*n gibi) ile ilgili daha fazla bilgi almak isterseniz şu linki kullanabilirsiniz.
Veritabanında ilgili değişiklikler uygulandıktan sonra, sisteme post ekleme ModelState.IsValid false olacağı için başarılı olmayacaktır. Ayrıca sisteme giriş yapan kullanıcıları otomatik olarak alıp veritabanına yazmamız gerektiği için aşağıdaki gibi bir yol izleyeceğiz.
[Authorize]
[HttpPost]
public async Task<IActionResult> AddPost(Post post){
//ModelState nesnesini temizliyoruz
ModelState.Clear();
//formda eksik olan kullanıcı alanını dolduruyoruz
post.user = await _userManager.GetUserAsync(HttpContext.User);//ModelState.IsValid true olması için
// modeli tekrar validate ediyoruz
TryValidateModel(post);
if (ModelState.IsValid)
...
Gerekli kod parçalarını zaten kod üzerinde anlattım, kod üzerinde anlatmadığım Authorize komutu ise ilgili action’ın üye girişi yapmayan kimseye görünmemesini sağlıyor.
Tüm action’ları elden geçirdiğim daha detaylı koda aşağıdan erişebilirsiniz.
Yukarıda herkesin sadece kendi postunu düzenlemesi, silmesi gibi işlemler yapılmış ve kod üzerinde yorum satırı olarak açıklanmıştır.
Veritabanına kullanıcı alanını ekledikten sonra ana sayfamızdaki her postun kim tarafından yazıldığını da artık gösterebiliriz. Bunun için öncelikle Views/Home/Index.cshtml dosyasını aşağıdaki gibi yapıyoruz.
@model IEnumerable<Post>
@foreach (var item in Model)
{
<div class="blog-post">
<h2 class="blog-post-title">@item.title </h2>
<p class="blog-post-meta">Yazar: <a href="#">@item.user</a></p>
<h3>@item.content</h3>
</div><!-- /.blog-post -->
}Eğer sunucuyu çalıştırırsanız Yazar karşının boş olduğunu görürsünüz. Bunun sebebi Entity Framework henüz lazy loading desteklemiyor. Peki nedir bu lazy loading derseniz, kabaca birbirine bağlı birden fazla nesnenin tek seferde kolayca çağırılması olayı. Düzeltmek ise oldukça kolay PostRepository içine gidip,
public List<Post> GetAllPosts()
{
return _appDbContext.posts.ToList<Post>();
}yerinepublic List<Post> GetAllPosts()
{
return _appDbContext.posts.Include(c => c.user).ToList<Post>();
}
yazıyoruz. Include(c => c.user) sayesinde tüm post nesnelerinin bağlantılı oldukları user nesneleri de taranıp geriye döndürülüyor. Artık sunucuyu çalıştırdığınızda her şeyin düzgün işlediğini göreceksiniz.
Şimdi iki yeni action oluşturacağız bunlardan ilki url/kullanıcıadı linkine gidince ilgili kullanıcının blog postlarını gösterecek diğeri ise blog postlarının detaylarını gösterecek.
PostsofUser fonksiyonu ile linke girilen kullanıcı adını (Route(“{username}”)) alıp kullanıcının sahip olduğu tüm postları bir listeye alıp geri döndürdük.
PostofUser ile ise id değişkenini kullanarak tek bir postun detaylarını gösteren sayfayı tasarladık. Kodlar üzerinde gerekli gördüğüm yerde açıklamalar yaptım. Böylece temel olarak yapmamız gereken herşeyi yaptık. Blog yazıları yazabiliyor, düzenleyebiliyor, silebiliyoruz. Ayrıca kendimize ait tüm yazıların göründüğü bir sayfamızda var.
Böylece seriyi sonlandırmış oluyorum. Belki Ckeditor kurulumu ve api yazımı ile alakalı birkaç yazı yazabilirim ama henüz net karar vermedim. Bu seri boyunca yazılan bilgilerin uzun süredir asp kodlayan biri tarafından değil asp ile yeni tanışmış biri tarafından yazıldığını unutmayın bu yüzden kafanıza yatmayan size garip görünen bir kod parçasıyla karşılaşırsanız daima sorgulayın.
Github Linki: https://github.com/yvznvr/MediumClone/tree/master