เนื้อหาของคำตอบ
1) วิธีเข้าถึงข้อมูลโมเดลใน Javascript / Jquery code block ใน.cshtml
ไฟล์
2) วิธีเข้าถึงข้อมูลโมเดลใน Javascript / Jquery code block ใน.js
ไฟล์
วิธีเข้าถึงข้อมูลโมเดลใน Javascript / Jquery code block ใน.cshtml
ไฟล์
ตัวแปร c # มีสองประเภทที่Model
กำหนดให้กับตัวแปร JavaScript
- ที่ได้รับมอบหมายคุณสมบัติ - ประเภทข้อมูลพื้นฐานเช่น
int
, string
, DateTime
(เช่น: Model.Name
)
- การกำหนดวัตถุ - คลาสที่กำหนดเองหรือคลาส inbuilt (เช่น:
Model
, Model.UserSettingsObj
)
ให้ดูรายละเอียดของการบ้านทั้งสองนี้
สำหรับส่วนที่เหลือของคำตอบให้พิจารณาตัวอย่างด้านล่างAppUser
เป็นตัวอย่าง
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; }
}
และค่าที่เรากำหนดให้โมเดลนี้คือ
AppUser appUser = new AppUser
{
Name = "Raj",
IsAuthenticated = true,
LoginDateTime = DateTime.Now,
Age = 26,
UserIconHTML = "<i class='fa fa-users'></i>"
};
การมอบหมายคุณสมบัติ
ให้ใช้ไวยากรณ์ที่แตกต่างกันสำหรับการกำหนดและสังเกตผลลัพธ์
1)ไม่มีการตัดการกำหนดคุณสมบัติในเครื่องหมายคำพูด
var Name = @Model.Name;
var Age = @Model.Age;
var LoginTime = @Model.LoginDateTime;
var IsAuthenticated = @Model.IsAuthenticated;
var IconHtml = @Model.UserIconHTML;
อย่างที่คุณเห็นมีข้อผิดพลาดสองสามข้อRaj
และTrue
ถือเป็นตัวแปรจาวาสคริปต์และเนื่องจากไม่มีvariable undefined
ข้อผิดพลาดเกิดขึ้น โดยที่สำหรับวันที่และเวลาที่หลากหลายข้อผิดพลาดคือunexpected number
ตัวเลขไม่สามารถมีอักขระพิเศษได้แท็ก HTML จะถูกแปลงเป็นชื่อเอนทิตีเพื่อเบราว์เซอร์จะไม่รวมค่าของคุณและมาร์กอัป HTML
2) การกำหนดคุณสมบัติในการห่อคำพูด
var Name = '@Model.Name';
var Age = '@Model.Age';
var LoginTime = '@Model.LoginDateTime';
var IsAuthenticated = '@Model.IsAuthenticated';
var IconHtml = '@Model.UserIconHTML';
ผลลัพธ์มีความถูกต้องดังนั้นการตัดการกำหนดคุณสมบัติในอัญประกาศทำให้เรามีไวยากรณ์ที่ถูกต้อง แต่โปรดทราบว่าAge
ตอนนี้Number เป็นสตริงดังนั้นหากคุณไม่ต้องการให้เราสามารถลบเครื่องหมายคำพูดและมันจะแสดงผลเป็นประเภทตัวเลข
3)ใช้@Html.Raw
แต่ไม่ต้องหุ้มมันด้วยเครื่องหมายคำพูด
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);
ผลลัพธ์คล้ายกับกรณีทดสอบของเรา 1 อย่างไรก็ตามการใช้งาน@Html.Raw()
บนHTML
สายอักขระแสดงการเปลี่ยนแปลงบางอย่างแก่เรา HTML จะถูกรักษาไว้โดยไม่เปลี่ยนเป็นชื่อเอนทิตี
จากเอกสารHtml.Raw ()
ห่อมาร์กอัพ HTML ในอินสแตนซ์ HtmlString เพื่อให้ตีความเป็นมาร์กอัพ HTML
แต่ก็ยังมีข้อผิดพลาดในบรรทัดอื่น
4)การใช้@Html.Raw
และการห่อด้วยคำพูด
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)';
ผลลัพธ์ที่ดีกับทุกประเภท แต่HTML
ตอนนี้ข้อมูลของเราเสียและสิ่งนี้จะทำให้สคริปต์เสียหาย ปัญหานี้เกิดขึ้นเนื่องจากเรากำลังใช้เครื่องหมายคำพูดเดี่ยว'
เพื่อตัดข้อมูลและแม้แต่ข้อมูลที่มีเครื่องหมายคำพูดเดี่ยว
เราสามารถเอาชนะปัญหานี้ได้ 2 วิธี
1) ใช้เครื่องหมายคำพูดคู่" "
เพื่อตัดส่วน HTML เนื่องจากข้อมูลภายในมีเครื่องหมายคำพูดเดียวเท่านั้น (ตรวจสอบให้แน่ใจว่าหลังจากห่อด้วยเครื่องหมายคำพูดคู่ไม่มี"
อยู่ในข้อมูลด้วย)
var IconHtml = "@Html.Raw(Model.UserIconHTML)";
2) หลีกเลี่ยงความหมายของตัวละครในโค้ดฝั่งเซิร์ฟเวอร์ของคุณ ชอบ
UserIconHTML = "<i class=\"fa fa-users\"></i>"
บทสรุปของการกำหนดคุณสมบัติ
- ใช้เครื่องหมายคำพูดสำหรับ dataType ที่ไม่ใช่ตัวเลข
- ห้ามใช้เครื่องหมายคำพูดสำหรับ dataType ที่เป็นตัวเลข
- ใช้
Html.Raw
เพื่อตีความข้อมูล HTML ของคุณตามที่เป็นอยู่
- ดูแลข้อมูล HTML ของคุณเพื่อหลีกเลี่ยงความหมายของคำพูดในฝั่งเซิร์ฟเวอร์หรือใช้คำพูดที่แตกต่างจากข้อมูลในระหว่างการกำหนดตัวแปร javascript
การกำหนดวัตถุ
ให้ใช้ไวยากรณ์ที่แตกต่างกันสำหรับการกำหนดและสังเกตผลลัพธ์
1)ไม่มีการกำหนดวัตถุในคำพูด
var userObj = @Model;
เมื่อคุณกำหนด ac # object ให้กับตัวแปร javascript ค่าของการ.ToString()
oject นั้นจะถูกกำหนด ดังนั้นผลลัพธ์ข้างต้น
2 การตัดการกำหนดวัตถุในเครื่องหมายคำพูด
var userObj = '@Model';
3)การใช้Html.Raw
โดยไม่ต้องใส่เครื่องหมายคำพูด
var userObj = @Html.Raw(Model);
4)ใช้Html.Raw
พร้อมกับคำพูด
var userObj = '@Html.Raw(Model)';
Html.Raw
เป็นของไม่มีประโยชน์มากสำหรับเราในขณะที่การกำหนดวัตถุให้กับตัวแปร
5)การใช้Json.Encode()
โดยไม่ต้องใส่เครื่องหมายคำพูด
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"
};
เราเห็นการเปลี่ยนแปลงบ้างเราเห็นว่าโมเดลของเรากำลังถูกตีความว่าเป็นวัตถุ entity names
แต่เราได้อักขระพิเศษเหล่านั้นเปลี่ยนไป การรวมไวยากรณ์ข้างต้นในเครื่องหมายคำพูดนั้นไม่มีประโยชน์อะไร เราเพียงรับผลลัพธ์เดียวกันภายในเครื่องหมายคำพูด
จากเอกสารของJson.Encode ()
แปลงออบเจ็กต์ข้อมูลเป็นสตริงที่อยู่ในรูปแบบ JavaScript Object Notation (JSON)
ในขณะที่คุณได้พบนี้แล้วปัญหาที่มีการกำหนดคุณสมบัติและหากคุณจำได้ว่าเราเอาชนะมันด้วยการใช้งานของentity Name
Html.Raw
ลองทำดูสิ ให้รวมกันHtml.Raw
และJson.Encode
6)การใช้Html.Raw
และJson.Encode
ไม่ใส่เครื่องหมายคำพูด
var userObj = @Html.Raw(Json.Encode(Model));
ผลลัพธ์เป็นวัตถุ Javascript ที่ถูกต้อง
var userObj = {"Name":"Raj",
"IsAuthenticated":true,
"LoginDateTime":"\/Date(1482573224421)\/",
"Age":26,
"UserIconHTML":"\u003ci class=\"fa fa-users\"\u003e\u003c/i\u003e"
};
7)การใช้Html.Raw
และJson.Encode
ภายในเครื่องหมายคำพูด
var userObj = '@Html.Raw(Json.Encode(Model))';
ตามที่คุณเห็นการตัดคำพูดให้ข้อมูล JSONแก่เรา
ข้อ จำกัด ในการมอบหมายวัตถุ
- การใช้งาน
Html.Raw
และJson.Encode
ใน combintaion เพื่อกำหนดวัตถุของคุณให้กับตัวแปรจาวาสคริปต์เป็นวัตถุ JavaScript
- ใช้
Html.Raw
และJson.Encode
ตัดมันภายในquotes
เพื่อรับJSON
หมายเหตุ:หากคุณสังเกตว่ารูปแบบข้อมูล DataTime ไม่ถูกต้อง นี่เป็นเพราะที่ได้กล่าวไปแล้วก่อนหน้านี้Converts a data object to a string that is in the JavaScript Object Notation (JSON) format
และ JSON ไม่มีdate
ประเภท ตัวเลือกอื่น ๆ ในการแก้ไขปัญหานี้คือการเพิ่มบรรทัดของรหัสอื่นเพื่อจัดการกับชนิดนี้เพียงอย่างเดียวโดยใช้วันที่ javascipt ()วัตถุ
var userObj.LoginDateTime = new Date('@Html.Raw(Model.LoginDateTime)');
//without Json.Encode
วิธีเข้าถึงข้อมูลโมเดลใน Javascript / Jquery code block ใน.js
ไฟล์
ไวยากรณ์ของมีดโกนไม่มีความหมายใน.js
ไฟล์และด้วยเหตุนี้เราจึงไม่สามารถใช้โมเดลของเราเพื่อแทรก.js
ไฟล์ได้ อย่างไรก็ตามมีวิธีแก้ไขเฉพาะหน้า
1)การแก้ปัญหาคือการใช้ตัวแปร JavaScript ทั่วโลก
เราต้องกำหนดค่าให้กับตัวแปร javascipt ที่มีขอบเขตทั่วโลกจากนั้นใช้ตัวแปรนี้ภายในบล็อคโค้ดทั้งหมดของคุณ.cshtml
และ.js
ไฟล์ ดังนั้นไวยากรณ์จะเป็น
<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>
ด้วยสิ่งนี้เราสามารถใช้ตัวแปรuserObj
และuserJsonObj
เป็นและเมื่อจำเป็น
หมายเหตุ:ฉันเองไม่แนะนำให้ใช้ตัวแปรทั่วโลกเพราะมันยากสำหรับการบำรุงรักษา แต่ถ้าคุณไม่มีตัวเลือกอื่น ๆ แล้วคุณสามารถใช้มันกับมีการประชุมตั้งชื่อที่เหมาะสม .. userAppDetails_global
สิ่งที่ต้องการ
2)การใช้function ()หรือclosure
ตัดรหัสทั้งหมดที่ขึ้นอยู่กับข้อมูลรุ่นในฟังก์ชั่น จากนั้นเรียกใช้ฟังก์ชันนี้จาก.cshtml
ไฟล์
external.js
function userDataDependent(userObj){
//.... related code
}
.cshtml
ไฟล์
<script type="text/javascript">
userDataDependent(@Html.Raw(Json.Encode(Model))); //execute the function
</script>
หมายเหตุ:ไฟล์ภายนอกของคุณจะต้องอ้างอิงก่อนสคริปต์ด้านบน มิฉะนั้นuserDataDependent
ฟังก์ชั่นจะไม่ได้กำหนด
โปรดทราบว่าฟังก์ชั่นจะต้องอยู่ในขอบเขตส่วนกลางด้วย ดังนั้นวิธีการแก้ปัญหาเราต้องจัดการกับผู้เล่นระดับโลก