Çö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.
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>

Hata mı alıyorsun da calışmıyor ID mi boş gönderiyor reposu varsa at, bakalım.
 
Hata mı alıyorsun da calışmıyor ID mi boş gönderiyor reposu varsa at, bakalım.
Kaydete bastığım zaman BookPages e hiçbir şey eklemiyor, Content vb. boş olduğu için de görüntülemiyorum olmayan şeyi. Şu an bir tık daha farklı ama hala bir farkı yok çalışmama konusunda.
 
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.
 
Son düzenleme:
Çözüm
Hocam çok sağ olun kaç saatimi aldı sırf nullable olmadığı için çalışmamasını görmeyişim baya sinir bozucu. CV me katmak için yapıyorum da henüz design patternler nasıl kullanılır bilmiyorum.

Bu arada projeyi ciddi mi öğrenmek için mi yapıyorsun bilmiyorum ama design patternlere bakmanı öneririm.
Hocam tasarım aşamasına geçtim de, hiçbir cshtml de navbarımı tam kaplanır şekilde yapamıyorum (_Layout.cshtmle yazarsam nedense tam boyut olabiliyor). Nedenini bulamadım acaba nedir siz biliyor msunuz?

@Enisertdev
 
Son düzenleme:
Hocam çok sağ olun kaç saatimi aldı sırf nullable olmadığı için çalışmamasını görmeyişim baya sinir bozucu. CV me katmak için yapıyorum da henüz design patternler nasıl kullanılır bilmiyorum.


Hocam tasarım aşamasına geçtim de, hiçbir cshtml de navbarımı tam kaplanır şekilde yapamıyorum (_Layout.cshtmle yazarsam nedense tam boyut olabiliyor). Nedenini bulamadım acaba nedir siz biliyor msunuz?

@Enisertdev
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
 

Technopat Haberler

Geri
Yukarı