Yanıtın İçeriği
1) .cshtml
Dosyadaki Javascript / Jquery kod bloğundaki Model verilerine nasıl erişilir
2) .js
Dosyadaki Javascript / Jquery kod bloğundaki Model verilerine nasıl erişilir
.cshtml
Dosyadaki Javascript / Jquery kod bloğundaki Model verilerine nasıl erişilir
Model
JavaScript değişkenine iki tür c # değişken ( ) ataması vardır.
- Mülkiyet atama - Temel veri türleri gibi
int
, string
, DateTime
(örn: Model.Name
)
- Nesne atama - Özel veya dahili sınıfları (örn:
Model
, Model.UserSettingsObj
)
Bu iki ödevin ayrıntılarına bakalım.
Cevabın geri kalanı için aşağıdaki AppUser
Modeli örnek olarak ele alalım.
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; }
}
Ve bu Modeli atadığımız değerler
AppUser appUser = new AppUser
{
Name = "Raj",
IsAuthenticated = true,
LoginDateTime = DateTime.Now,
Age = 26,
UserIconHTML = "<i class='fa fa-users'></i>"
};
Mülk ataması
Ödev için farklı sözdizimi kullanalım ve sonuçları gözlemleyelim.
1) Özellik atamasını tırnak içine almadan.
var Name = @Model.Name;
var Age = @Model.Age;
var LoginTime = @Model.LoginDateTime;
var IsAuthenticated = @Model.IsAuthenticated;
var IconHtml = @Model.UserIconHTML;
Gördüğünüz gibi birkaç hata var Raj
ve True
javascript değişkenleri olarak kabul ediliyor ve var olmadığı için bu bir variable undefined
hata. DateTime değişkenine gelince hatanın unexpected number
sayıları özel karakterlere sahip olamazsa, HTML etiketleri varlık adlarına dönüştürülür, böylece tarayıcı değerlerinizi ve HTML işaretlemesini karıştırmaz.
2) Tırnak içinde özellik atama.
var Name = '@Model.Name';
var Age = '@Model.Age';
var LoginTime = '@Model.LoginDateTime';
var IsAuthenticated = '@Model.IsAuthenticated';
var IconHtml = '@Model.UserIconHTML';
Sonuçlar geçerlidir, Bu nedenle özellik atamasını tırnak içine almak bize geçerli bir sözdizimi verir. Ama numara Age
şimdi bir dize olduğunu unutmayın , Yani istemiyorsanız sadece tırnak kaldırabilirsiniz ve bir sayı türü olarak işlenir.
3) kullanarak @Html.Raw
ancak olmadan tırnak içinde sararak
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);
Sonuçlar Ancak kullanarak test durumu 1. benzer @Html.Raw()
üzerinde HTML
bize bazı değişiklik gösterdi mi dize. HTML, varlık adlarına değiştirilmeden korunur.
Html.Raw () dokümanlarından
HTML işaretlemesini HTML işaretlemesi olarak yorumlanacak şekilde bir HtmlString örneğinde sarar.
Ama yine de diğer satırlarda hatalarımız var.
4) kullanma @Html.Raw
ve tırnak içine sarma
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)';
Sonuçlar tüm tiplerde iyidir. Ancak HTML
verilerimiz artık kırıldı ve bu komut dosyalarını bozacak. Sorun, '
verileri sarmak için tek tırnak kullandığımız ve hatta verilerin tek tırnak içerdiği için.
Bu sorunu 2 yaklaşımla aşabiliriz.
1) " "
HTML bölümünü sarmak için çift tırnak kullanın. Iç veriler sadece tek tırnak olduğu için. (Çift tırnak işareti ile kaydırdıktan "
sonra verilerin içinde de bulunmadığından emin olun )
var IconHtml = "@Html.Raw(Model.UserIconHTML)";
2) Sunucu tarafı kodunuzdaki karakter anlamından kaçın. Sevmek
UserIconHTML = "<i class=\"fa fa-users\"></i>"
Mülkiyet tahsisinin sonuçlandırılması
- Sayısal olmayan dataType için tırnak işaretleri kullanın.
- Sayısal dataType için tırnak işareti kullanmayın.
Html.Raw
HTML verilerinizi olduğu gibi yorumlamak için kullanın .
- Sunucu verilerindeki tırnak anlamından kaçmak için HTML verilerinize dikkat edin veya javascript değişkenine atama sırasında verilerden farklı bir alıntı kullanın.
Nesne atama
Ödev için farklı sözdizimi kullanalım ve sonuçları gözlemleyelim.
1) Nesne atamasını tırnak içine almadan.
var userObj = @Model;
Javascript değişkenine ac # nesnesi atadığınızda .ToString()
, o atlamanın değeri atanacaktır. Dolayısıyla yukarıdaki sonuç.
2 Alıntılarda nesne kaydırma
var userObj = '@Model';
3)Html.Raw
Tırnaklar olmadan kullanma .
var userObj = @Html.Raw(Model);
4)Html.Raw
Tırnaklarla birlikte kullanma
var userObj = '@Html.Raw(Model)';
Html.Raw
Değişkene bir nesne atarken bizim için çok faydası oldu.
5)Json.Encode()
Tırnaklar olmadan kullanma
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"
};
Bazı değişiklikler görüyoruz, Modelimizin bir nesne olarak yorumlandığını görüyoruz. Ama o özel karakterlere dönüştük entity names
. Yukarıdaki sözdizimini tırnak içine almak da pek işe yaramaz. Aynı sonucu tırnak içinde alırız.
Json.Encode () dokümanlarından
Bir veri nesnesini JavaScript Nesne Gösterimi (JSON) biçimindeki bir dizeye dönüştürür.
entity Name
Mülk atamasıyla bu sorunla daha önce karşılaştığınız ve hatırlarsanız, kullanımı ile üstesinden geldik Html.Raw
. Hadi deneyelim. Birleştirelim Html.Raw
veJson.Encode
6) Tırnaklı Html.Raw
ve Json.Encode
tırnaksız.
var userObj = @Html.Raw(Json.Encode(Model));
Sonuç geçerli bir Javascript Nesnesidir
var userObj = {"Name":"Raj",
"IsAuthenticated":true,
"LoginDateTime":"\/Date(1482573224421)\/",
"Age":26,
"UserIconHTML":"\u003ci class=\"fa fa-users\"\u003e\u003c/i\u003e"
};
7) kullanılması Html.Raw
ve Json.Encode
tırnak içinde.
var userObj = '@Html.Raw(Json.Encode(Model))';
Tırnaklarla kaydırmayı gördüğünüz gibi bize bir JSON verisi verir
Nesne atamasına ilişkin sonuç
- Nesnenizi javascript değişkenine JavaScript nesnesi olarak atamak için
Html.Raw
ve Json.Encode
birleşiminde kullanın .
- Bir JSON almak için kullanın
Html.Raw
ve Json.Encode
içine sarınquotes
Not: DataTime veri formatının doğru olmadığını gözlemlediyseniz. Bunun nedeni, daha önce de belirtildiği gibi Converts a data object to a string that is in the JavaScript Object Notation (JSON) format
ve JSON bir date
tür içermemesidir . Bunu düzeltmenin diğer seçenekleri, javascipt Date () nesnesini kullanarak bu türü tek başına işlemek için başka bir kod satırı eklemektir.
var userObj.LoginDateTime = new Date('@Html.Raw(Model.LoginDateTime)');
//without Json.Encode
.js
Dosyadaki Javascript / Jquery kod bloğundaki Model verilerine nasıl erişilir
Razor sözdiziminin .js
dosyada bir anlamı yoktur ve bu nedenle Modelimizi doğrudan bir .js
dosyaya ekleyemeyiz . Ancak bir çözüm var.
1) Çözüm javascript Global değişkenlerini kullanmaktır .
Değeri genel kapsamdaki bir javascipt değişkenine atamalı ve sonra bu değişkeni sizin .cshtml
ve .js
dosyalarınızın tüm kod bloğu içinde kullanmalıyız . Yani sözdizimi
<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>
Bu ile değişkenleri userObj
ve userJsonObj
gerektiğinde ve gerektiği zaman kullanabiliriz .
Not: Ben şahsen, küresel değişkenlerin bakım için zorlaşmasını önermiyorum. Ancak başka bir seçeneğiniz yoksa, uygun bir adlandırma kuralına sahip olarak kullanabilirsiniz .. gibi bir şey userAppDetails_global
.
2) Bir işlevdekiclosure
model verilerine bağlı olan tüm kodu function () veya Wrap kullanarak . Ve sonra bu işlevi .cshtml
dosyadan yürütün .
external.js
function userDataDependent(userObj){
//.... related code
}
.cshtml
dosya
<script type="text/javascript">
userDataDependent(@Html.Raw(Json.Encode(Model))); //execute the function
</script>
Not: Harici komut dosyasına yukarıdaki komut dosyasından önce başvurulmalıdır. Aksi takdirde userDataDependent
işlev tanımsızdır.
Ayrıca işlevin de global kapsamda olması gerektiğini unutmayın. Yani her iki çözüm de küresel kapsamdaki oyuncularla uğraşmak zorundayız.