Isi dari Jawabannya
1) Cara mengakses data Model dalam blok kode Javascript / Jquery dalam .cshtml
file
2) Cara mengakses data Model dalam blok kode Javascript / Jquery dalam .js
file
Cara mengakses data Model dalam blok kode Javascript / Jquery dalam .cshtml
file
Ada dua jenis Model
penugasan c # variable ( ) untuk variabel JavaScript.
- Tugas Properti - tipe data dasar seperti
int
, string
, DateTime
(ex: Model.Name
)
- Penugasan objek - Kelas khusus atau bawaan (mis .:
Model
, Model.UserSettingsObj
)
Mari kita melihat detail dari dua tugas ini.
Untuk sisa jawabannya, mari pertimbangkan AppUser
Model di bawah ini sebagai contoh.
public class AppUser
{
public string Name { get; set; }
public bool IsAuthenticated { get; set; }
public DateTime LoginDateTime { get; set; }
public int Age { get; set; }
public string UserIconHTML { get; set; }
}
Dan nilai yang kami berikan pada Model ini adalah
AppUser appUser = new AppUser
{
Name = "Raj",
IsAuthenticated = true,
LoginDateTime = DateTime.Now,
Age = 26,
UserIconHTML = "<i class='fa fa-users'></i>"
};
Penugasan properti
Mari kita gunakan sintaks yang berbeda untuk penugasan dan amati hasilnya.
1) Tanpa membungkus penugasan properti dalam tanda kutip.
var Name = @Model.Name;
var Age = @Model.Age;
var LoginTime = @Model.LoginDateTime;
var IsAuthenticated = @Model.IsAuthenticated;
var IconHtml = @Model.UserIconHTML;
Seperti yang Anda lihat ada beberapa kesalahan, Raj
dan True
dianggap sebagai variabel javascript dan karena mereka tidak ada variable undefined
kesalahan. Sedangkan untuk varialble dateTime kesalahannya adalah unexpected 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.
var Name = '@Model.Name';
var Age = '@Model.Age';
var LoginTime = '@Model.LoginDateTime';
var IsAuthenticated = '@Model.IsAuthenticated';
var IconHtml = '@Model.UserIconHTML';
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 kutip
var Name = @Html.Raw(Model.Name);
var Age = @Html.Raw(Model.Age);
var LoginTime = @Html.Raw(Model.LoginDateTime);
var IsAuthenticated = @Html.Raw(Model.IsAuthenticated);
var IconHtml = @Html.Raw(Model.UserIconHTML);
Hasilnya mirip dengan uji kasus kami 1. Namun penggunaan @Html.Raw()
pada HTML
string memang menunjukkan kepada kami beberapa perubahan. HTML dipertahankan tanpa mengubah nama entitasnya.
Dari dokumen Html.Raw ()
Membungkus markup HTML dalam instance HtmlString sehingga ditafsirkan sebagai markup HTML.
Tapi kami masih memiliki kesalahan di jalur lain.
4) Menggunakan @Html.Raw
dan juga membungkusnya dengan tanda kutip
var Name ='@Html.Raw(Model.Name)';
var Age = '@Html.Raw(Model.Age)';
var LoginTime = '@Html.Raw(Model.LoginDateTime)';
var IsAuthenticated = '@Html.Raw(Model.IsAuthenticated)';
var IconHtml = '@Html.Raw(Model.UserIconHTML)';
Hasilnya 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)
var IconHtml = "@Html.Raw(Model.UserIconHTML)";
2) Menghindari makna karakter dalam kode sisi server Anda. Suka
UserIconHTML = "<i class=\"fa fa-users\"></i>"
Kesimpulan penugasan properti
- Gunakan kutipan untuk tipe data non numerik.
- Jangan gunakan kutipan untuk tipe data numerik.
- Gunakan
Html.Raw
untuk menafsirkan data HTML Anda apa adanya.
- Jaga data HTML Anda untuk menghindari makna kutipan di sisi server, Atau gunakan kutipan berbeda dari pada data selama penugasan ke variabel javascript.
Tugas objek
Mari kita gunakan sintaks yang berbeda untuk penugasan dan amati hasilnya.
1) Tanpa membungkus penugasan objek dalam tanda kutip.
var userObj = @Model;
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
var userObj = '@Model';
3) Menggunakan Html.Raw
tanpa tanda kutip.
var userObj = @Html.Raw(Model);
4) Menggunakan Html.Raw
bersama dengan kutipan
var userObj = '@Html.Raw(Model)';
Itu Html.Raw
tidak banyak berguna bagi kami saat menetapkan objek ke variabel.
5) Menggunakan Json.Encode()
tanpa tanda kutip
var userObj = @Json.Encode(Model);
//result is like
var userObj = {"Name":"Raj",
"IsAuthenticated":true,
"LoginDateTime":"\/Date(1482572875150)\/",
"Age":26,
"UserIconHTML":"\u003ci class=\"fa fa-users\"\u003e\u003c/i\u003e"
};
Kami 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 ()
Mengonversi objek data ke string yang dalam format JavaScript Object Notation (JSON).
Karena Anda telah mengalami entity Name
masalah ini dengan penetapan properti dan jika Anda ingat kami mengatasinya dengan penggunaan Html.Raw
. Jadi mari kita coba itu. Mari kita gabungkan Html.Raw
danJson.Encode
6) Menggunakan Html.Raw
dan Json.Encode
tanpa tanda kutip.
var userObj = @Html.Raw(Json.Encode(Model));
Hasil adalah Obyek Javascript yang valid
var userObj = {"Name":"Raj",
"IsAuthenticated":true,
"LoginDateTime":"\/Date(1482573224421)\/",
"Age":26,
"UserIconHTML":"\u003ci class=\"fa fa-users\"\u003e\u003c/i\u003e"
};
7) Menggunakan Html.Raw
dan Json.Encode
dalam kutipan.
var userObj = '@Html.Raw(Json.Encode(Model))';
Seperti yang Anda lihat, pembungkus dengan kutipan memberi kita data JSON
Kesimpulan pada penugasan Objek
- Gunakan
Html.Raw
dan Json.Encode
dalam kombinasi untuk menetapkan objek Anda ke variabel javascript sebagai objek JavaScript .
- Gunakan
Html.Raw
dan Json.Encode
bungkus juga quotes
untuk mendapatkan JSON
Catatan: 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 mengandung date
tipe. Pilihan lain untuk memperbaiki ini adalah dengan menambahkan baris lain kode untuk menangani jenis ini saja menggunakan javascipt Tanggal () objek
var userObj.LoginDateTime = new Date('@Html.Raw(Model.LoginDateTime)');
//without Json.Encode
Cara mengakses data Model dalam blok kode Javascript / Jquery dalam .js
file
Sintaks 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 adalah
<script type="text/javascript">
var userObj = @Html.Raw(Json.Encode(Model)); //For javascript object
var userJsonObj = '@Html.Raw(Json.Encode(Model))'; //For json data
</script>
Dengan ini di tempat kita dapat menggunakan variabel userObj
dan userJsonObj
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
function userDataDependent(userObj){
//.... related code
}
.cshtml
mengajukan
<script type="text/javascript">
userDataDependent(@Html.Raw(Json.Encode(Model))); //execute the function
</script>
Catatan: 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.