וובמאסטר - תיכנות ובניית אתרים

מדריך ASP.NET MVC – הגדרת Action שמחזיר JSON

ori_calvo ,‏ מכללת הי טק‏ ‏/‏ 30 מרץ, 2011
F+
F-

בפרק הקודם השתמשנו בפונקצית העזר 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

image

השגיאה שהתקבלה היא תוצר של תהליך ההמרה של האובייקט ה-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. בחן את הנתונים שחוזרים מהשרת:

image

ניתן להשתמש ב-Viewer נחמד הנמצא בלינק הבא על מנת להציג את הנתונים בצורה יותר נוחה:

image

לאחר העתקת הטקסט ניתן לעבור לתצוגת "Viewer":

image

בפרק זה למדנו כיצד להגדיר Action חדש המחזיר נתונים בתצורת JSON. בפרקים הבאים נראה כיצד להשתמש בנתונים אלו בצד הדפדפן.

תגיות: פיתוח‏  /  צד שרת‏  /  ASP.NET MVC‏  /  .net‏  /  מדריך‏  

תגובות בפייסבוק

תגובות למאמר



עוד במדריך

תגיות פופולאריות

X
הצטרף לעמוד שלנו בפייסבוק להישאר מעודכן!
וובמאסטר © כל הזכויות שמורות