Saya memiliki kode ini di Controller saya:
List<string> order = new List<string>();
[Route("Reservations/Overview/Refresh/id")]
[AllowAnonymous]
public JsonResult AddOrder(string id)
{
if(!order.Contains(id))order.Add(id);
return Json($"ok", JsonRequestBehavior.AllowGet);
}
[Route("Reservations/Overview/Check/id")]
[HttpPost]
public JsonResult Check(string id)
{
if (order.Contains(id))
{
order.Remove(id);
return Json(true);
}
else return Json(false);
}
Semuanya berfungsi tetapi daftar pesanan global saya selalu kosong. Mengapa?
2 jawaban
HTTP bersifat stateless. Setiap permintaan membuat instance baru dari kelas pengontrol, yang tidak akan mencerminkan perubahan apa pun yang dibuat pada variabel tingkat kelas pada instance sebelumnya (yang telah lama dibuang) dari permintaan sebelumnya.
Pada dasarnya Anda perlu menyimpan data Anda di suatu tempat. Ada berbagai tempat untuk melakukan ini:
- Status sesi
- Nilai statis
- Sebuah database
- Mekanisme cache
- Di halaman itu sendiri (diposting kembali dengan data formulir)
- Kue
- File
- dan seterusnya...
Setiap opsi akan memiliki pro dan kontra, tergantung pada fungsionalitas lengkap yang Anda butuhkan. Status sesi mungkin merupakan pendekatan paling sederhana untuk membantu Anda memulai. Pada halaman itu sendiri dapat dianggap lebih RESTful dan, dengan demikian, lebih terukur/portabel. Basis data akan lebih aman daripada di halaman itu sendiri karena pengguna dapat memodifikasi apa pun di halaman. Dll.
Tapi intinya tetap terlepas dari opsi mana yang Anda inginkan ... Data perlu dipertahankan (disimpan) di suatu tempat agar dapat membacanya lagi di lain waktu.
Variabel global tidak bertahan di beberapa permintaan ke controller. Anda dapat menyimpannya ke database, atau menyimpan pesanan dalam sesi:
Session["Orders"] = orders;
Anda harus menyimpan daftar pesanan yang diperbarui ke sesi setiap kali Anda mengubah daftar atau data dalam daftar dengan cara apa pun. Sesi adalah per pengguna; hanya berhati-hatilah berapa banyak data yang Anda masukkan ke dalam sesi jika Anda melakukannya. Jika Anda menggunakan database, Anda harus mempertahankan perubahan rekaman kapan pun nilai berubah pada rekaman, atau saat membuat rekaman baru.