Saya mencoba mempelajari Entity Framework dan saya suka memahami konsep dasar.

Dalam program pengujian saya memiliki kode ini:

ApplicationDbContext.cs

  public class ApplicationDbContext : DbContext
  {
        public DbSet<Book> Books { get; set; }
  }

BukuController.cs

public IActionResult Index()
{
    ViewBag.Books = _db.Books.ToList();
    return View();
}

Index.cshtml

<br />
<div class="container row p-0 m-0">
    <div class="col-6">
        <h2 class="text-info">Book List</h2>
    </div>
    <div class="col-3 offset-3">
        <a asp-action="Upsert" asp-controller="Books" class="btn btn-info form-control text-white">
            Add New Book
        </a>
    </div>

    <div class="col-12 border p-3">
        <table id="DT_load" class="table table-striped table-bordered" style="width:100%">
            <thead>
                <tr>
                    <th>Name</th>
                    <th>Author</th>
                    <th>ISBN</th>
                    <th>IdCat</th>
                    <th>DescCat</th>
                    <th></th>
                </tr>

                @foreach (var book in ViewBag.Books)
                {
                <tr>
                    <td>@book.Name</td>
                    <td>@book.Author</td>
                    <td>@book.ISBN</td>
  
                    <td>
                        <div class="text-center">
                            <a href="/Books/Upsert?id=@book.Id" class='btn btn-success text-white' style='cursor:pointer; width:70px;'>
                                Edit
                            </a>
                            &nbsp;
                            <a class='btn btn-danger text-white' style='cursor:pointer; width:70px;'
                               onclick= "/books/Delete?id=@book.Id">
                                Delete
                            </a>
                        </div>



                    </td>
                </tr>
                }

            </thead>
        </table>
    </div>
</div>

Kode ini berfungsi seperti yang saya harapkan dan menampilkan kisi-kisi semua buku.

Tapi sejujurnya saya pikir ini bukan cara yang tepat untuk menggunakan pengontrol dan model.

Saya suka melewati daftar dalam tampilan:

   return View(_db.Books.ToList());

Atau dengan format lain dan gunakan sebagai model dengan menambahkan di index.cshtml baris seperti ini:

@model "my parameter"

Singkatnya di tempat ViewBag saya suka menggunakan model.

Pertama-tama, saya bertanya: Apakah benar apa yang saya suka lakukan?

Atau dalam hal ini saya dapat menyimpan ViewBag karena kodenya berfungsi dan pendekatan ini benar?

Pertanyaan ini, tidak hanya untuk menemukan solusi yang berhasil, tetapi untuk menemukan praktik terbaik untuk mengikuti konsep MVC.

Terima kasih!

1
user3449922 6 Januari 2021, 17:20

3 jawaban

Jawaban Terbaik

Anda bisa mencobanya sebagai berikut.

Pengontrol Anda

public IActionResult Index()
{
    var books = _db.Books.ToList();
    return View(books);
}

Melihat

@model IEnumerable<YourNamespace.Models.Book>

@foreach (var book in Model)
{
<tr>
    <td>@book.Name</td>
    <td>@book.Author</td>
    <td>@book.ISBN</td>

    <td>
        <div class="text-center">
            <a href="/Books/Upsert?id=@book.Id" class='btn btn-success text-white' style='cursor:pointer; width:70px;'>
                Edit
            </a>
            &nbsp;
            <a class='btn btn-danger text-white' style='cursor:pointer; width:70px;'
               onclick= "/books/Delete?id=@book.Id">
                Delete
            </a>
        </div>
    </td>
</tr>
}
1
derodevil 6 Januari 2021, 14:52

Pertama-tama, saya bertanya: Apakah benar apa yang saya suka lakukan?

Ya, sebagian besar pengembang lebih memilih model tampilan yang diketik daripada ViewBag untuk tampilan non-sepele. Dengan cara ini kompiler dapat membantu Anda menemukan kesalahan ketik dalam tampilan Anda dan IDE dapat menyediakan itellisense.

tapi saya harus melewati daftar atau yang serupa bukan kelas

Itu tidak masalah. Anda memberikan contoh "beberapa kelas" ke tampilan Anda. Jika berupa daftar, "beberapa kelas" = List<Book>.

 // in your view
 @model System.Collections.Generic.List<MyApp.Models.Book>

 // loop
 @foreach(var book in Model) 

(Anda harus menyesuaikan namespace)

Tapi...

Dalam banyak kasus, Anda memerlukan lebih dari sekadar daftar, jadi ada baiknya memiliki kelas model tampilan terpisah, yang bisa sesederhana

public record BooksListViewModel(List<Book> Result);

// in your controler
return View(new BooksListViewModel(books));

// in your view
@model WebApplication1.ViewModels.BooksListViewModel

@foreach(var book in Model.Result)

Perhatikan bahwa saya telah menggunakan fitur record baru dari C# 9. Jika Anda menggunakan versi yang lebih lama, Anda harus membuat kelas "normal" dengan satu properti "Hasil". Lihat https://docs.microsoft .com/en-us/dotnet/csharp/whats-new/csharp-9#record-types

0
Christoph Lütjen 6 Januari 2021, 14:52

Praktik terbaik yang harus diikuti adalah membuat model tampilan dan menggunakan model tampilan itu untuk tampilan. Ini memungkinkan Anda untuk menambahkan fitur-fitur baru dengan sedikit kerja ekstra. Umumnya Anda akan memiliki tampilan yang berbeda untuk menambah/mengedit, menghapus, menampilkan, dll.

Model

public class BooksViewModel
{
    public List<Book> books = null;
}

Pengontrol

public IActionResult Index()
{
    var viewModel = new BooksViewModel();
    viewModel.books = _db.Books.ToList();

    return View(viewModel);
}

Melihat

@model BooksViewModel

@foreach (var book in Model.books)
{
    
}

Sekarang jika Anda ingin menambahkan beberapa data lain ke tampilan ini, Anda cukup menambahkannya ke model dan mengisinya di controller.

0
hijinxbassist 6 Januari 2021, 14:52