Saya menulis aplikasi web yang akan memungkinkan pengguna untuk menjelajah ke beberapa halaman web dalam situs web yang membuat permintaan tertentu. Semua informasi yang input pengguna akan disimpan dalam objek yang saya buat. Masalahnya adalah bahwa saya memerlukan objek ini untuk diakses dari bagian mana pun dari situs web dan saya tidak benar-benar tahu cara terbaik untuk mencapai ini. Saya tahu bahwa salah satu solusinya adalah menggunakan variabel sesi tetapi saya tidak tahu bagaimana menggunakannya di asp .net MVC. Dan di mana saya akan mendeklarasikan variabel sesi? Apakah ada cara lain?
169
Jawaban:
Saya akan berpikir Anda akan ingin memikirkan apakah semuanya benar-benar termasuk dalam keadaan sesi. Ini adalah sesuatu yang saya lakukan setiap sekarang dan kemudian dan ini adalah pendekatan yang sangat bagus untuk semuanya, tetapi Anda harus berhati-hati ketika meletakkan sesuatu dalam konteks sesi. Tidak semuanya harus ada di sana hanya karena itu milik beberapa pengguna.
di global.asax mengaitkan acara OnSessionStart
Dari mana saja dalam kode di mana properti HttpContext.Current! = Null Anda dapat retrive objek itu. Saya melakukan ini dengan metode ekstensi.
Dengan cara ini Anda bisa dalam kode
sumber
Jawabannya di sini benar, namun saya berjuang untuk mengimplementasikannya dalam aplikasi ASP.NET MVC 3. Saya ingin mengakses objek Sesi di controller dan tidak tahu mengapa saya terus mendapatkan "Instance tidak diatur ke instance dari kesalahan Object". Apa yang saya perhatikan adalah bahwa dalam pengontrol ketika saya mencoba mengakses sesi dengan melakukan hal berikut, saya terus mendapatkan kesalahan itu. Ini disebabkan oleh fakta bahwa this.HttpContext adalah bagian dari objek Controller.
Namun, apa yang saya inginkan adalah HttpContext yang merupakan bagian dari namespace System.Web karena ini adalah jawaban yang disarankan untuk digunakan di Global.asax.cs di atas. Jadi saya harus secara eksplisit melakukan hal berikut:
ini membantu saya, tidak yakin apakah saya melakukan sesuatu yang bukan MO di sekitar sini, tapi saya harap ini membantu seseorang!
sumber
Karena saya tidak suka melihat "HTTPContext.Current.Session" tentang tempat itu, saya menggunakan pola tunggal untuk mengakses variabel sesi, ini memberi Anda akses yang mudah untuk mengetik data yang sangat diketik.
maka Anda dapat mengakses data Anda dari mana saja:
sumber
Jika Anda menggunakan asp.net mvc, berikut adalah cara sederhana untuk mengakses sesi.
Dari Pengendali:
Dari Tampilan:
Ini jelas bukan cara terbaik untuk mengakses variabel sesi Anda, tetapi ini adalah rute langsung. Jadi gunakan dengan hati-hati (lebih disukai selama prototyping cepat), dan gunakan Wrapper / Container dan OnSessionStart ketika itu menjadi tepat.
HTH
sumber
Baiklah, IMHO ..
Berkenaan dengan # 1, saya memiliki Tampilan Master sangat diketik yang memiliki properti untuk mengakses apa pun yang mewakili objek Sesi .... dalam contoh saya Master View diketik adalah generik yang memberi saya beberapa fleksibilitas sehubungan dengan Lihat Halaman diketik kuat
lalu...
sumber
Meskipun saya tidak tahu tentang asp.net mvc, tetapi ini adalah apa yang harus kita lakukan di situs web .net biasa. Ini harus bekerja untuk asp.net mvc juga.
Anda akan meletakkan ini di dalam metode untuk akses mudah. HTH
sumber
Ada 3 cara untuk melakukannya.
Saya lebih suka cara ke-3. Tautan ini adalah referensi yang bagus.
Dapatkan / Set Metode Sesi HttpContext di BaseController vs Mengejek HttpContextBase untuk membuat metode Get / Set
sumber
Cara saya mengakses sesi adalah menulis kelas pembantu yang merangkum berbagai nama bidang dan tipenya. Saya harap contoh ini membantu:
sumber
Jawaban yang bagus dari teman-teman tetapi saya akan memperingatkan Anda agar tidak selalu mengandalkan Sesi. Ini cepat dan mudah untuk melakukannya, dan tentu saja akan berhasil tetapi tidak akan bagus dalam semua keadaan.
Misalnya jika Anda mengalami skenario di mana hosting Anda tidak mengizinkan penggunaan sesi, atau jika Anda berada di web farm, atau dalam contoh aplikasi SharePoint yang dibagikan.
Jika Anda menginginkan solusi yang berbeda, Anda bisa melihat menggunakan Kontainer IOC seperti Castle Windsor , membuat kelas penyedia sebagai pembungkus dan kemudian menjaga satu contoh kelas Anda menggunakan per permintaan atau gaya hidup sesi tergantung pada kebutuhan Anda.
IOC akan memastikan bahwa instance yang sama dikembalikan setiap kali.
Lebih rumit ya, jika Anda membutuhkan solusi sederhana cukup gunakan sesi.
Berikut adalah beberapa contoh implementasi di bawah ini yang tidak menarik.
Dengan menggunakan metode ini Anda bisa membuat kelas penyedia di sepanjang baris:
Dan daftarkan sesuatu seperti:
sumber
Anda dapat menggunakan ViewModelBase sebagai kelas dasar untuk semua model, kelas ini akan menangani penarikan data dari sesi
Anda dapat menulis metode ekstensi pada HttpContextBase untuk menangani data sesi
Gunakan ini seperti di bawah ini di controller
Argumen kedua adalah opsional itu akan digunakan mengisi data sesi untuk kunci itu ketika nilai tidak ada dalam sesi.
sumber