Çözüldü Sayfa Ekleme Methodu çalışmıyor

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

spam

Decapat
Katılım
3 Mayıs 2023
Mesajlar
383
Çözümler
3
Daha fazla  
Cinsiyet
Erkek
Asp Dotnet MVC ile bir kütüphane sitesi yapıyorum ve AddBookPage.cshtml de girdiğim kaçıncı sayfa sayısı ve içeriğe göre BookDetailste kitabın içeriğini göstersin istiyorum fakat AddBookPage methodu çalışmıyor ve nedenini anlamıyorum. Güncel kodlar;

HomeController.cs
C#:
    public IActionResult BookDetails(int id)
    {
        var book = _context.Kitaplar
            .Include(b => b.Category)
            .Include(b => b.Pages)
            .FirstOrDefault(b => b.Id == id);

        if (book == null)
            return NotFound();

        return View(book);
    }


    [HttpGet]
    public IActionResult AddBookPage(int bookId)
    {
        var page = new BookPageModel
        {
            BookModelId = bookId
        };

        return View(page);
    }

    [HttpPost]
    public IActionResult AddBookPage(BookPageModel page)
    {
        if (!ModelState.IsValid)
        {
            return View(page);
        }

        if (page.BookModelId == 0)
        {
            ModelState.AddModelError("", "Kitap ID bulunamadı.");
            return View(page);
        }

        _context.BookPages.Add(page);
        _context.SaveChanges();

        return RedirectToAction("BookDetails", new { id = page.BookModelId });
    }


AppDbContext.cs
C#:
 public class AppDbContext : DbContext
    {
        public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }

        public DbSet<UserModel> Kullanicilar { get; set; }
        public DbSet<BookPageModel> BookPages { get; set; }

        public DbSet<BookModel> Kitaplar { get; set; }
        public DbSet<CategoryModel> Kategoriler { get; set; }
        public DbSet<UserBookProgressModel> Kitapİlerlemesi { get; set; }



        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {

 modelBuilder.Entity<BookModel>()
            .HasMany(b => b.KitapSayfasi)
            .WithOne(p => p.BookModel)
            .HasForeignKey(p => p.BookModelId);

        base.OnModelCreating(modelBuilder);


        modelBuilder.Entity<CategoryModel>()
            .HasKey(c => c.Id);



            modelBuilder.Entity<CategoryModel>()
                .HasMany(c => c.SubCategories)
                .WithOne(c => c.ParentCategory)
                .HasForeignKey(c => c.ParentCategoryId);

            base.OnModelCreating(modelBuilder);


        }


BookModel.cs
C#:
    public class BookModel
    {
        public int Id { get; set; }
        public string Title { get; set; } = "";
        public string Author { get; set; } = "";
        public int CategoryId { get; set; }
        public CategoryModel? Category { get; set; }
        public int PageCount { get; set; }
        public int CreatedByUserId { get; set; }
        public UserModel? CreatedByUser { get; set; }
        public byte[]? CoverImage { get; set; }

    public ICollection<BookPageModel> Pages { get; set; } = new List<BookPageModel>();

    }


BookPageModel.cs
C#:
 public class BookPageModel
  {
    public int Id { get; set; }
    public int BookModelId { get; set; }
    public BookModel? BookModel { get; set; }
    public int PageNumber { get; set; }
    public string Content { get; set; } = string.Empty;

}


}


BookDetails.cshtml
HTML:
@model kutuphane.Models.BookModel

<h2>@Model.Title</h2>
<p>Yazar: @Model.Author</p>
<p>Kategori: @Model.Category?.Name</p>
<p>Sayfa Sayısı: @Model.PageCount</p>

<h3>Kitap İçeriği</h3>

@if (Model.Pages != null && Model.Pages.Any())
{
    <ul>
        @foreach(var sayfa in Model.Pages.OrderBy(p => p.PageNumber))
        {
            <li><strong>Sayfa @sayfa.PageNumber:</strong> @sayfa.Content</li>
        }
    </ul>
}
else
{
    <p>Kitap içeriği bulunamadı.</p>
}

<a asp-controller="Home" asp-action="AddBookPage" asp-route-bookId="@Model.Id">Sayfa Ekle</a>


AddBookPage.cshtml
HTML:
@model kutuphane.Models.BookPageModel
<h2>Sayfa Ekle</h2>
<form asp-action="AddBookPage" method="post">
    <input type="hidden" asp-for="BookModelId" />
    <label for="PageNumber">Sayfa Numarası</label>
    <input asp-for="PageNumber" id="PageNumber" />
    <label for="Content">İçerik</label>
    <textarea asp-for="Content" id="Content"></textarea>
    <button type="submit">Kaydet</button>
</form>
 
Son düzenleme:
Çözüm
C#:
 public BookModel BookModel { get; set; }
//bu property nullable olmadığı için.

public IActionResult AddBookPage(BookPageModel page)
{
 if (!ModelState.IsValid)
 {
 return View(page);
 }
 // bu modelstate invalid dönüyor

Nullable yapıp dener misin?

Bu arada projeyi ciddi mi öğrenmek için mi yapıyorsun bilmiyorum ama design patternlere bakmanı öneririm.
Tam anlamamış olabilirim demek istediğini ama Layout. Cshtml e yazarsan her view için otomatik import ediliyor bu, her view için ayrı navbar oluşturuyorsan
C#:
{Layout=null;}
Yapman gerekir

Hocam bilmiyorum ya su an bayağı batırdım, dedim madem layoutta yazabiliyorum orada yazayım. Orada yaptım ama bu sefer her pagede olacak diye giriş yapamadan sayfaya gidememe yaptım şimdi giriş yapınca da sayfalara gidilmiyor.
 
Hocam bilmiyorum ya su an bayağı batırdım, dedim madem layoutta yazabiliyorum orada yazayım. Orada yaptım ama bu sefer her pagede olacak diye giriş yapamadan sayfaya gidememe yaptım şimdi giriş yapınca da sayfalara gidilmiyor.

Giriş yapmayanları nasıl engelliyorsun ve giriş yaparken kullanıcıları nasıl authorize ediyorsun o kodları da paylaşsan.
 
Giriş yapmayanları nasıl engelliyorsun ve giriş yaparken kullanıcıları nasıl authorize ediyorsun o kodları da paylaşsan.
Gidilmesini istemediğim sayfanın controllerinin içine


C#:
 var currentUserId = HttpContext.Session.GetInt32("UserId");
    if (!currentUserId.HasValue)
    {
        TempData["Error"] = "Lütfen giriş yapın.";
        return RedirectToAction("Login");
    }

yazıyordum.

Kullanıcıları ise login controllerindaki
C#:
HttpContext.Session.SetInt32("UserId", user.Id);
var userModel = _context.Kullanicilar.FirstOrDefault(u => u.Id == user.Id);

        return RedirectToAction("MainMenu");
         
        }

ile tutuyorum. Fakat kod su an aşırı karıştı ve ne yapacğım bilmiyorum.
 
Gidilmesini istemediğim sayfanın Controllerinin içine.

C#:
 var currentUserId = HttpContext.Session.GetInt32("UserId");
 if (!currentUserId.HasValue)
 {
 TempData["Error"] = "Lütfen giriş yapın.";
 return RedirectToAction("Login");
 }

Yazıyordum.

Kullanıcıları ise login controllerindaki.
C#:
HttpContext.Session.SetInt32("UserId", user.Id);
var userModel = _context.Kullanicilar.FirstOrDefault(u => u.Id == user.Id);

 return RedirectToAction("MainMenu");

 }

İle tutuyorum. Fakat kod su an aşırı karıştı ve ne yapacğım bilmiyorum.

Aynı kodu ekledim bende calısıyor başka yerde hata yapmış olabilirsin.
 
Aynı kodu ekledim bende calısıyor başka yerde hata yapmış olabilirsin.

Hocam CTRL Z, CTRL Y derken bütün kodlar girdi birbirine su an öncesi sonrası ne belli olmadığından MainMenu haric hiçbir yer açılmıyor, controllerlarda ve returnlerde baya saçmalık yarattım. Güncel halini atayım mı isterseniz?
 
Bekliyorum sizi, kafanıza bir şey takılır ise sorabilirsiniz birkaç işlem daha eklemiştim çünkü.
1747687255907.png
Bir de demeyi unutmuşum, belli olmuyor ama üç çizgi burada.
 
Son düzenleme:
Evet sildim fakat sorun onların olup olmamasında değil ki.

En önemli hatan layout da model belirtmen mesela layout da user modeli import etmişsin başka bir viewde örneğin book modeli import edeceğin zaman hata verir. İlla Layout'ta dinamik veri işleyeceksen bunu View Component'lerle yapman gerekir.

ek: Yerinde olsam youtubeden baştan sona nasıl mvc projesi yapılır ona bakardım, şu anki haliyle herşey karmakarışık mvc nin amacı zaten bu karmaşıklığı en aza indirmek
 

Technopat Haberler

Geri
Yukarı