מדריך ASP.NET MVC – הגדרת Action שמחזיר JSON
בפרק הקודם השתמשנו בפונקצית העזר Ajax.ActionLink אשר שולחת בקשת HTTP באופן א-סינכרוני לשרת ומקבלת בחזרה תשובה בתצורת HTML. ה-HTML אשר חזר מהשרת מאוכסן באופן דינאמי בתוך מסמך ה-HTML וזאת ללא התערבות מצד המשתמש. יכולת זו שיפרה את חווית המשתמש שכן לא כל התצוגה נטענה מחדש אלא רק חלק ממנה.
חשוב להבין, שבבסיס הפעילות של הפונקציה Ajax.ActionLink מסתתרת ההנחה שהשרת מחזיר HTML. לרוב, HTML זה "מנופח" ויהיה גדול יותר מהנתון האמיתי שמסתתר בתוכו. במקרים בהם אנו מעוניינים לאכסן בצד הדפדפן נתונים יבשים (לא HTML) שישמשו לעבודה חכמה בצד הדפדפן ניתן להחזיר מהשרת נתונים בתצורת JSON. תצורה זו נוחה לעבודה בצד הדפדפן וניתן להמיר את הנתונים לאוסף של אובייקטי JavaScript.
בפרק זה נלמד כיצד להגדיר Action אשר מחזיר מידע לדפדפן בתצורת JSON. בפרקים הבאים נלמד כיצד ניתן להשתמש במידע זה ולהופכו ל-HTML ללא התערבות מצד השרת.
להורדת הקוד של הפרק הקודם לחץ כאן
פתח את הקובץ GroupController.cs והוסף את הפונקציה הבאה:
public ActionResult Items(int? id, bool? desc)
{
AddressBookDB db = AddressBookDB.Create();
Group group;
if (id == null)
{
group = db.Root;
}
else
{
group = (Group)db.GetItemByID(id.Value);
}
bool orderByDesc = (desc ?? false);
BookItem[] items = SortItems(group.Items, orderByDesc);
return Json(items, JsonRequestBehavior.AllowGet);
}
הפונקציה מקבלת את ה-ID של הקבוצה שיש להחזיר את הפריטים שמוכלים בתוכה. לאחר שליפת הנתונים מהמודל, נעשה שימוש בפונקצית העזר Json אשר יודעת לקבל אובייקט CLR רגיל ולתרגמו ל-HTTP Response מסוג JSON. תהליך התרגום מתבצע ע"י קריאה של כל ה-Properties של האובייקט הנתון וכתיבתם בתצורת JSON
הרץ את התוכנית ונסה לגשת ל-URL הבא http://AddressBook/Group/Items/1
השגיאה שהתקבלה היא תוצר של תהליך ההמרה של האובייקט ה-CLR-י לנתונים בתצורת JSON.
כפי שניתן לראות מהשגיאה תהליך ההמרה איננו יודע להתמודד בהצלחה עם מצב בו האובייקט המומר מחזיק reference לאובייקט אחר שמחזיק reference חזרה לאובייקט הראשון (מצב זה נקרא Circular Reference). על מנת לפתור בעיה זו, ניתן להמיר את האובייקט group לאובייקט אחר שאיננו יוצר Circular References. פתח את הקובץ Models\Group.cs ובחן את הפונקציה ToJSON אשר ממירה קבוצה לאובייקט אחר פשוט יותר:
public override object ToJSON()
{
return new
{
ID = this.ID,
Name = this.Name,
Description = this.Description,
};
}
באותו אופן ממומשת הפונקציה גם עבור המחלקה Person.
תקן את ה-Action החדש שהוספנו כך שישתמש במתודה הססטית ToJSON:
public ActionResult Items(int? id, bool? desc)
{
AddressBookDB db = AddressBookDB.Create();
Group group;
if (id == null)
{
group = db.Root;
}
else
{
group = (Group)db.GetItemByID(id.Value);
}
bool orderByDesc = (desc ?? false);
BookItem[] items = SortItems(group.Items, orderByDesc);
object data = BookItem.ToJSON(items).ToArray();
return Json(data, JsonRequestBehavior.AllowGet);
}
הרץ את התוכנית וגש שוב ל-URL הבא http://AddressBook/Group/Items/1. בחן את הנתונים שחוזרים מהשרת:
ניתן להשתמש ב-Viewer נחמד הנמצא בלינק הבא על מנת להציג את הנתונים בצורה יותר נוחה:
לאחר העתקת הטקסט ניתן לעבור לתצוגת "Viewer":
בפרק זה למדנו כיצד להגדיר Action חדש המחזיר נתונים בתצורת JSON. בפרקים הבאים נראה כיצד להשתמש בנתונים אלו בצד הדפדפן.
תגובות בפייסבוק