Ini adalah artikel kedua dalam seri tentang DotVVM.
Artikel pertama lebih cenderung berupa lembar fakta. Saya mencoba dengan contoh sederhana untuk menunjukkan cara bekerja di DotVVM di tingkat dasar. Artikel itu, pada kenyataannya, tidak menyentuh yang paling penting: cara kerjanya.
Artikel ini didedikasikan untuk masalah ini serta optimasi lalu lintas.
Artikel ini akan memeriksa secara lebih rinci komunikasi antara klien dan server.
Anda dapat mengambil contoh dari artikel sebelumnya dengan daftar yang harus dilakukan. Dalam aplikasi yang ditulis di sana, dimungkinkan untuk menambahkan case baru dan menandainya sudah selesai.
Komunikasi
Ketika sebuah halaman diminta, URL diurai dan DotVVM mencarinya di DotVVMStartup.cs, di mana dalam tabel rute ada jalur ke file .dothtml, di mana, pada gilirannya, ada arahan ke ViewModel.
The ViewModel adalah serial di json dan ini memberlakukan aturan tertentu pada ViewModel. Semua metode publik dan properti publik (string, Guid, bool, int, tipe numerik lainnya, DateTime, koleksi (array, List) jatuh ke json. Dalam kasus List, ini dapat berupa kumpulan dari tipe sederhana yang sama, atau objek yang digunakan tipe ini .
Ketika bekerja dengan DotVVM dalam proyek nyata, beberapa aturan untuk arsitektur ViewModel terungkap, yang kami coba patuhi.
- Jangan gunakan Entity Framework DbContext secara langsung di ViewModel
- Jangan tampilkan Entitas bersih dalam Tampilan, tetapi gunakan DTO (Objek Transfer Data)
- Untuk kontrol lebih besar atas ViewModel, harus mewarisi DotvvmViewModelBase
Jadi misalkan ViewModel berhasil dirakit di json, semua binding front-end dihasilkan dalam View dan halaman dimuat. Bergantian, metode yang diwarisi dari DotvvmViewModelBase lulus: Init (), Load (), dan PreRender (). Saat Anda pertama kali memuat halaman, menimpa fungsi-fungsi ini mungkin berguna, tetapi hal pertama yang pertama.

Tambahkan kasing baru dengan daftar.
- AJAX POST dikirim ke server dari json dari ViewModel yang dimodifikasi
- ViewModel yang sama diturunkan ke memori server, tetapi tidak berubah
- Oleh Init ()
- Server ViewModel yang tidak berubah dibandingkan dengan apa yang datang dari klien
- Diproduksi oleh Beban ()
- Metode itu sendiri sedang dieksekusi.
- Oleh PreRender ()
- Setelah perbandingan, perubahan dikirim kembali ke klien.
Ketika ViewModel Anda mewarisi DotvvmViewModelBase, Anda memiliki akses ke Init (), Load () dan PreRender (). Ketiga metode ini abstrak dan dapat diperluas dan dimodifikasi.
Juga, di DotvvmViewModelBase ada properti dari konteks konteks permintaan, dari mana ada akses ke objek permintaan, ke properti IsPostBack, ke parameter URL, dan
banyak lagi .
Mengirim dengan setiap postback seluruh ViewModel tidak sangat efisien. Untuk setidaknya mengurangi jumlah data yang dikirim, dalam DotVVM ada beberapa pendekatan.
Mengikat atribut
Atribut Bind memungkinkan Anda memberi tahu kompiler bagaimana menangani properti di ViewModel.

- [Bind (Direction.Both)] - Pengaturan default. Data dikirim pada setiap permintaan.
- [Bind (Direction.None)] - Ini terutama digunakan untuk layanan dan fasad yang tidak mengalami serialisasi, tetapi digunakan dalam ViewModel untuk memuat atau menyimpan ini.
- [Bind (Direction.ServerToClient)] - Data dikirim hanya dalam satu arah, dari server ke klien. Artinya hanya saat memuat halaman, tetapi tidak dengan postback.
- [Bind (Direction.ServerToClientFirstRequest)] - Ideal untuk data statis. Misalnya opsi dalam kotak kombo
- [Bind (Direction.ClientToServer)] - Data dikirim hanya dalam satu arah, dengan postback, dari klien ke server.
Perintah statis
DotVVM juga memungkinkan Anda untuk meminta metode statis di server. Efektivitas dari metode tersebut adalah mereka hanya mengirim jawaban, yaitu, seluruh ViewModel berasal dari server, tetapi hanya bagian yang kita butuhkan. Metode statis seperti itu dapat mengambil parameter dan mengembalikan nilai.
Dalam contoh kami, ada tempat di mana Anda dapat menerapkan perintah Statis. Ketika kami menandai suatu kasus sebagai selesai. Tidak perlu mengirim seluruh ViewModel ke server.
Anda dapat menulis ulang metode MarkAsDone (item ToDoItem) ke metode statis dengan mentransfernya ke kelas statis terpisah dan menambahkan atribut
[AllowStaticCommand] ke metode.
namespace FirstDotvvmApp { public static class ToDoItemValidator { [AllowStaticCommand] public static bool IsDone() => true; } }
Anda juga harus mengubah Tampilan dengan menambahkan arahan dengan namespace tempat kelas statis kami berada.
@import FirstDotvvmApp
Tombol tidak hanya akan menggunakan perintah, tetapi perintah static.
<dot:Button Validation.Enabled="false" Visible="{value: !IsDone}" Text="Mark as done" Click="{staticCommand: IsDone = ToDoItemValidator.IsDone()}"> </dot:Button>
Sebagai perbandingan, Anda dapat melihat berapa banyak lalu lintas yang kami simpan.

Biasanya, kombinasi dari kedua pendekatan digunakan untuk menghemat lalu lintas saat berkomunikasi pada proyek nyata.
Referensi
Contoh lebih lanjut tentang penggunaan fitur baru dapat ditemukan di
sini .
Baru-baru ini juga ada
aliran (Ind.) Di DotVVM 2.0 , di mana mereka berbicara tentang inovasi utama dan fitur baru.