Saya memiliki model berikut yang dibungkus dalam model tampilan saya
public class FloorPlanSettingsModel
{
public int Id { get; set; }
public int? MainFloorPlanId { get; set; }
public string ImageDirectory { get; set; }
public string ThumbnailDirectory { get; set; }
public string IconsDirectory { get; set; }
}
Bagaimana cara mengakses salah satu properti di atas dari Javascript?
Saya mencoba ini, tetapi saya "tidak terdefinisi"
var floorplanSettings = "@Model.FloorPlanSettings";
alert(floorplanSettings.IconsDirectory);
c#
javascript
jquery
asp.net-mvc
model
Referensi Null
sumber
sumber
Jawaban:
Anda bisa mengambil seluruh model sisi server dan mengubahnya menjadi objek Javascript dengan melakukan hal berikut:
Dalam kasus Anda jika Anda hanya ingin objek FloorPlanSettings, cukup kirimkan
Encode
metode properti itu:sumber
Cara mengakses data Model dalam blok kode Javascript / Jquery dalam
.cshtml
fileAda dua jenis
Model
penugasan c # variable ( ) untuk variabel JavaScript.int
,string
,DateTime
(ex:Model.Name
)Model
,Model.UserSettingsObj
)Mari kita melihat detail dari dua tugas ini.
Untuk sisa jawabannya, mari pertimbangkan
AppUser
Model di bawah ini sebagai contoh.Dan nilai yang kami berikan pada Model ini adalah
Penugasan properti
Mari kita gunakan sintaks yang berbeda untuk penugasan dan amati hasilnya.
1) Tanpa membungkus penugasan properti dalam tanda kutip.
Seperti yang Anda lihat ada beberapa kesalahan,
Raj
danTrue
dianggap sebagai variabel javascript dan karena mereka tidak adavariable undefined
kesalahan. Sedangkan untuk varialble dateTime kesalahannya adalahunexpected number
angka tidak dapat memiliki karakter khusus, Tag HTML dikonversi menjadi nama entitasnya sehingga browser tidak mencampurkan nilai Anda dan markup HTML.2) Membungkus tugas properti dalam Quotes.
Hasilnya valid, Jadi membungkus penugasan properti dalam tanda kutip memberi kita sintaks yang valid. Tetapi perhatikan bahwa Bilangan
Age
sekarang menjadi string, Jadi jika Anda tidak ingin kami hanya dapat menghapus tanda kutip dan itu akan diberikan sebagai tipe angka.3) Menggunakan
@Html.Raw
tetapi tanpa membungkusnya dengan tanda kutipHasilnya mirip dengan uji kasus kami 1. Namun penggunaan
@Html.Raw()
padaHTML
string memang menunjukkan kepada kami beberapa perubahan. HTML dipertahankan tanpa mengubah nama entitasnya.Dari dokumen Html.Raw ()
Tapi kami masih memiliki kesalahan di jalur lain.
4) Menggunakan
@Html.Raw
dan juga membungkusnya dengan tanda kutipHasilnya bagus dengan semua tipe. Tetapi
HTML
data kami sekarang rusak dan ini akan merusak skrip. Masalahnya adalah karena kami menggunakan tanda kutip tunggal'
untuk membungkus data dan bahkan data memiliki tanda kutip tunggal.Kami dapat mengatasi masalah ini dengan 2 pendekatan.
1) menggunakan tanda kutip ganda
" "
untuk membungkus bagian HTML. Karena data dalam hanya memiliki kutipan tunggal. (Pastikan bahwa setelah membungkus dengan tanda kutip ganda tidak ada"
dalam data juga)2) Menghindari makna karakter dalam kode sisi server Anda. Suka
Kesimpulan penugasan properti
Html.Raw
untuk menafsirkan data HTML Anda apa adanya.Tugas objek
Mari kita gunakan sintaks yang berbeda untuk penugasan dan amati hasilnya.
1) Tanpa membungkus penugasan objek dalam tanda kutip.
Ketika Anda menetapkan objek ac # ke variabel javascript nilai dari
.ToString()
objek tersebut akan ditetapkan. Maka hasil di atas.2 Membungkus penugasan objek dalam tanda kutip
3) Menggunakan
Html.Raw
tanpa tanda kutip.4) Menggunakan
Html.Raw
bersama dengan kutipanItu
Html.Raw
tidak banyak berguna bagi kami saat menetapkan objek ke variabel.5) Menggunakan
Json.Encode()
tanpa tanda kutipKami melihat beberapa perubahan, Kami melihat Model kami ditafsirkan sebagai objek. Tetapi kami memiliki karakter khusus yang diubah menjadi
entity names
. Juga membungkus sintaks di atas dalam tanda kutip tidak banyak berguna. Kami hanya mendapatkan hasil yang sama dalam kutipan.Dari dokumen Json.Encode ()
Karena Anda telah mengalami
entity Name
masalah ini dengan penetapan properti dan jika Anda ingat kami mengatasinya dengan penggunaanHtml.Raw
. Jadi mari kita coba itu. Mari kita gabungkanHtml.Raw
danJson.Encode
6) Menggunakan
Html.Raw
danJson.Encode
tanpa tanda kutip.Hasil adalah Obyek Javascript yang valid
7) Menggunakan
Html.Raw
danJson.Encode
dalam kutipan.Seperti yang Anda lihat, pembungkus dengan kutipan memberi kita data JSON
Kesimpulan pada penugasan Objek
Html.Raw
danJson.Encode
dalam kombinasi untuk menetapkan objek Anda ke variabel javascript sebagai objek JavaScript .Html.Raw
danJson.Encode
bungkus jugaquotes
untuk mendapatkan JSONCatatan: Jika Anda telah mengamati format data DataTime tidak benar. Ini karena seperti yang dikatakan sebelumnya
Converts a data object to a string that is in the JavaScript Object Notation (JSON) format
dan JSON tidak mengandungdate
tipe. Pilihan lain untuk memperbaiki ini adalah dengan menambahkan baris lain kode untuk menangani jenis ini saja menggunakan javascipt Tanggal () objekCara mengakses data Model dalam blok kode Javascript / Jquery dalam
.js
fileSintaks Razor tidak memiliki arti dalam
.js
file dan karenanya kami tidak dapat secara langsung menggunakan Model kami sebagai.js
file. Namun ada solusinya.1) Solusi menggunakan variabel Global javascript .
Kami harus menetapkan nilai ke variabel javascipt lingkup global dan kemudian menggunakan variabel ini dalam semua blok kode Anda
.cshtml
dan.js
file. Jadi sintaksnya adalahDengan ini di tempat kita dapat menggunakan variabel
userObj
danuserJsonObj
sebagai dan bila diperlukan.Catatan: Saya pribadi tidak menyarankan menggunakan variabel global karena sangat sulit untuk pemeliharaan. Namun jika Anda tidak memiliki pilihan lain maka Anda dapat menggunakannya dengan memiliki konvensi penamaan yang tepat .. sesuatu seperti
userAppDetails_global
.2) Menggunakan fungsi () atau
closure
Bungkus semua kode yang tergantung pada data model dalam suatu fungsi. Dan kemudian jalankan fungsi ini dari.cshtml
file.external.js
.cshtml
mengajukanCatatan: File eksternal Anda harus dirujuk sebelum skrip di atas. Lain yang
userDataDependent
fungsi tidak terdefinisi.Perhatikan juga bahwa fungsi tersebut harus berada dalam lingkup global juga. Jadi salah satu solusi kita harus berurusan dengan pemain yang memiliki cakupan global.
sumber
var model = @Html.Raw(Json.Encode(Model));
ini akan membuat objek javascriptmodel
yang tidak memiliki koneksi dengan C # Model yang Anda lewatkan . Infact tidak akan adaModel
setelah tampilan telah diberikan. Jadi Formulir di UI tidak akan memiliki petunjuk tentang perubahan data objek javascript. Anda sekarang harus meneruskan seluruh model yang dimodifikasi ini ke controller melalui AJAX, Atau Anda perlu memperbarui nilai kontrol input Anda dalam bentuk menggunakan javascript.Although I did the same thing using hidden Html control and bound it to EventCommand and updated it's value in javascript. But wondering if could do same directly to model?
untuk pernyataan ini .. tidak adaEventCommand
di MVC, untuk Webforms di mana ada koneksi antara UI dan tindakan server, Dalam MVC semuanya terpisah. Satu-satunya cara bagi Anda untuk berinteraksi dengan pengontrol adalah melalui AJAX atau Formulir Kirim atau Permintaan halaman Baru (muat ulang juga)coba ini: (Anda melewatkan satu tanda kutip)
sumber
JSON
tanda kutip tanpa memberi Andajavascript Object
. Periksa jawaban saya di utas yang sama untuk detail lebih lanjut. stackoverflow.com/a/41312348/2592042Membungkus properti model di sekitar parens bekerja untuk saya. Anda masih mendapatkan masalah yang sama dengan Visual Studio mengeluh tentang semi-colon, tetapi berhasil.
sumber
Jika kesalahan "ReferenceError: Model tidak didefinisikan" dimunculkan, maka Anda dapat mencoba menggunakan metode berikut:
Semoga ini membantu...
sumber
Saya tahu ini sudah terlambat tetapi solusi ini berfungsi sempurna untuk kedua kerangka .net dan .net inti:
@ System.Web.HttpUtility.JavaScriptStringEncode ()
sumber