מדריך ASP.NET MVC – שימוש ב- TempData
בפרק זה אנו נמשיך לשכלל את ממשק המשתמש. הפעם נשתמש בתשתית פשוטה הקרויה TempData המאפשרת לנו ל"גלגל" מידע מתצוגה אחת לשנייה.
להורדת הקוד של הפרק הקודם לחץ כאן
דמיין לעצמך את המקרה הבא: לאחר שהמשתמש מחק פריט מסוים מתוך ספר הכתובות אנו מעוניינים להציג למשתמש חיווי מתאים בתצוגה הבאה על מנת שיהיה ברור שהפעולה הסתיימה בהצלחה.
הוסף Partial View חדש בשם "Notify" תחת ספריית ה-Shared:
עדכן את הקוד באופן הבא:
@model AddressBook.Models.BookItem
@using AddressBook.Models;
<script src="@Url.Content("~/Scripts/Shared/Notify.js")"
type="text/javascript"></script>
@if (TempData.ContainsKey("notifyMessage"))
{
<div class="notify">
<p>
@TempData["notifyMessage"]
</p>
</div>
}
שים לב כיצד ה-View מתחקר את אובייקט השירות TempData ומברר האם מחכה הודעה בתוכו. במידה וכן, ההודעה מוצגת. בנוסף, שים לב כי התצוגה מכילה קישור לקובץ JavaScript בשם Notify.js
הוסף קובץ JavaScript חדש תחת Scripts\Shared\Notify.js ובו נטפל באפקט ה-FadeOut של ה-Notification:
/// <reference path="../jquery-1.4.4-vsdoc.js" />
jQuery(document).ready(function ()
{
jQuery(".notify").fadeOut(3500);
});
עדכן את קובץ הפריסה הראשי של התוכנית Layout.cshtml_ כך שיכיל את התצוגה החלקית שבנינו מעלה:
<body>
@{Html.RenderPartial("Notify");}
<div class="header">
...
</div>
@RenderBody()
<div class="footer">
...
</div>
</body>
</html>
עדכן את פעולת המחיקה של פריט בספר תחת ה-BookController והוסף הודעה חדשה לתוך האובייקט TempData:
[HttpPost]
[Authorize(Roles = "admin")]
public ActionResult Delete(int id)
{
AddressBookDB db = AddressBookDB.Create();
BookItem item = db.GetItemByID(id);
int parentId = item.Parent.ID;
db.DeleteItem(item);
db.SaveChanges();
TempData["notifyMessage"] = "Item \"" +
item.Description +
"\" was deleted successfully";
return RedirectToAction("Index", "Group",
new { id = parentId });
}
הרץ את התוכנית ובחן כיצד ההודעה מוצגת ונעלמת (תוך מספר שניות) לאחר שפריט מסוים בספר נמחק.
יש לציין כמה נקודות חשובות בעבודה עם TempData:
- TempData מאפשר לנו להעביר נתונים מתצוגה אחת לשנייה בין שני Requests שונים של ה-Browser
- הנתון מאוכסן בתוך ה-TempData עד אשר ייקרא ע"י הקוד שלנו באחד או יותר מהבקשות הבאות שיגיעו מאותו Browser
- TempData מיושם בעזרת המנגנון Session State, כלומר כאשר ה-Session איננו זמין (לדוגמא, במקרה בו ביצענו לו Disable) אזי ה-TempData לא ניתן לשימוש.
- מאחר והמנגנון מיושם בעזרת Session State עלינו להבטיח כי ה-Session State זמין לכל השרתים בצד השרת ולכן יש לשקול שימוש ב- Session State Server או כל מכניזם אחר המאפשר שיתוף של ה-Session State בין שרתים שונים.
בפרק זה למדנו כיצד ניתן להשתמש באובייקט השירות TempData על מנת לגלגל מידע מתצוגה אחת לשניה בין בקשות שונות של אותו דפדפן.
בפרק הבא נמשיך לעסוק בנושא זה ונלמד כיצד אובייקט שירותי אחר הנקרא ViewBag מאפשר להעביר מידע מה-Controller ל-View.
תגובות בפייסבוק