Çö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.
Hocam başka yerde kullanmam diye orada belirttim onları da hata onlardan kaynaklı değil ama düşündüğüm kadarıyla.
 
Zahmet olucak ama düzeltebilme imkanınız var mı?
 
Neresi tam olarak calısmayan kitap ekleme kısmı mı
AddBook sayfasına gidilmiyor ve hamburger dropwdownda bütün liste gözüküyor.
Gidilmiyor derken, üstte attığınız InvalidOperationException: hatasını veriyor.
 
Addbook sayfasına gidilmiyor ve hamburger dropwdownda bütün liste gözüküyor.
Gidilmiyor derken, üstte attığınız ınvalidoperationexception: Hatasını veriyor.

C#:
 public IActionResult AddBook()
 {
 var mainCategories = _context.Kategoriler
 .Where(c => c.ParentCategoryId == null)
 .Include(c => c.SubCategories)
 .ToList();

 ViewBag.MainCategories = mainCategories;

 return View(mainCategories);
 }

Bu kısımda View'e yanlış değer gönderilmiş böyle düzelt

Dropdown içinde ben tüm kategorileri listelemiştim Components/CategoryViewComponent içinden istediğin Query'e değiştirebilirsin.
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için çerezleri kabul etmelisiniz. Daha Fazlasını Öğren.…