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?

1
j.j.a.c.k. 13 Desember 2017, 18:58
Kedua metode tindakan akan dipanggil secara terpisah, maka Anda akan mendapatkan daftar kosong untuk setiap panggilan/permintaan ... jika Anda ingin melakukannya dengan cara ini, buat saja statis dan bagikan dengan semua aplikasi
 – 
Ahmed Negm
13 Desember 2017, 19:03
Tetapi saya tidak suka itu kecuali Anda perlu membuatnya dapat diakses selama sesi saat ini, lalu gunakan variabel Sesi sebagai gantinya
 – 
Ahmed Negm
13 Desember 2017, 19:05

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.

3
David 13 Desember 2017, 19:06
Oh terima kasih, saya entah bagaimana melewatkannya .. terima kasih atas solusinya
 – 
j.j.a.c.k.
13 Desember 2017, 19:18

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.

3
Brian Mains 13 Desember 2017, 19:52