מדריך ASP.NET MVC

מדריך ASP.NET MVC – שימוש ב- ViewBag

‏ • Hi Tech

ViewBag הינו אובייקט תשתיתי אשר מאפשר לנו להעביר מידע מה-Controller ל-View.

ה-ViewBag הינו סוג של Dictionary אשר ניתן לאכסן בתוכו כל אובייקט אחר ולקרוא אותו בחזרה תוך כדי הריצה של ה-View. ה-ViewBag ממומש באמצעות יכולות ה-dynamic של השפה המאפשרות לקרוא ולכתוב Properties אשר אינם ידועים בזמן קומפילציה.

להורדת הקוד של הפרק הקודם לחץ כאן

בדוגמא שלנו, אנו מעוניינים להוסיף יכולות מיון לתצוגה של קבוצה:

image

פתח את הקובץ Views/Group/Menu.cshtml והוסף אליו את הקטע קוד הבא:

<div class="menu">
  ...
 
  @if (this.ViewBag.AllowSorting ?? false)
  {
    if (this.ViewBag.OrderByDesc ?? false)
    {
    @Html.ActionLink("Sort asc",
                    "Index",
                    "Group",
                    new { id = this.Model.ID, desc = false },
                    new { @class = "sort" })
    }
    else
    {
    @Html.ActionLink("Sort desc",
                     "Index",
                     "Group",
                     new { id = this.Model.ID, desc = true },
                     new { @class = "sort" })
    }
  }
 
  <hr 
/>
</
div
>

שים לב לשימוש שנעשה באובייקט ViewBag. כאמור, אובייקט זה הינו מסוג dynamic כך שהקומפיילר "עוצם את עיניו" ואינו ואוכף את החוקים הרגילים. בזמן ריצה במידה ואנו מנסים לקרוא Property שאיננו קיים באובייקט אזי נקבל null.

פתח את הקובץ Controllers\GroupController.cs וערוך את ה-Action בשם Index:

public ActionResult Index(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);
  ViewBag.Items = items;
  ViewBag.OrderByDesc = orderByDesc;

  return View(group);
}

שים לב כיצד ה-Action מקבל פרמטר בשם "desc". פרמטר זה הינו אופציונאלי ובמידה והוא מתקבל מהדפדפן אזי ערכו קובע את סדר המיון (מגדול לקטן או להיפך). בנוסף, הקוד מאתחל שני Properties באובייקט ViewBag:

  • Items – אוסף הפריטים המוכלים בקבוצה הנוכחית אך ממוינים עפ"י הסדר הנכון
  • OrderByDesc – משתנה בוליאני הקובע את סדר המיון

שתי התכונות מעלה נמסרות לתצוגה Views\Group\Index.cshtml המשתמשת בהם על מנת להציג את האובייקטים בסדר הנכון וכן דואגת להעבירם לתצוגה החלקית Menu.cshtml:

Html.RenderPartial( "Menu", 
                    this.Model, new ViewDataDictionary() {
                    { "AllowAdd", true },
                    { "AllowSorting", true },
                    { "AllowEdit", true },
                    { "OrderByDesc", this.ViewBag.OrderByDesc }});

ה-ViewBag איננו "מתגלגל" אוטומטית בין התצוגות השונות ועל כן התצוגה Index.cshtml מעבירה פרמטרים לתצוגה החלקית Menu.cshtml דרך המילון ViewDataDictionary. כל מפתח במילון זה הופך ל-Property ב-ViewBag של התצוגה החלקית.

תקן את התצוגה Views\Group\Index.cshtml כך שבמקום להציג את הפריטים המוכלים ישירות בתוך אובייקט המודל Group, יוצגו הפריטים המוכלים בתוך ה-ViewBag. פריטים אלה כבר ממוינים בסדר הנכון:

foreach (BookItem item in this.ViewBag.Items)
{
...
}

הרץ את התוכנית. ודא כי ניתן למיין את הפריטים תחת תצוגת הקבוצה בסדר עולה:

image

ובסדר ההפוך,

image

 

בפרק זה למדנו כיצד להשתמש באובייקט ViewBag על מנת להעביר נתונים המשפיעים על התצוגה מה-Controller ל-View. ראינו כי הנתונים אשר מאוכסנים באובייקט זה אינם מועברים אוטומטית מהתצוגה הראשית לתצוגה החלקית.

בעבודה היום יומית עם ה-ViewBag יש לשים לב כי איננו “מעמיסים” עליו יותר מדי מידע. אובייקט זה איננו Type Safe ובקלות עלול להביא לשגיאות לוגיות. במידה ונדרש להעביר כמות נתונים גדולה מה-Controller ל-View יש לשקול שימוש באובייקט מודל ייעודי לכך.

תגיות: , , , ,

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