ASP.NET MVC Part 4: ทำความรู้จักกับ ViewData, ViewBag และ TempData

การส่งผ่านข้อมูลระหว่างกันใน ASP.NET MVC จะมีการส่งผ่านกันด้วย objects ซึ่งใน ASP.NET MVC จะมี object ที่ชื่อ ViewData, ViewBag และ TempData เป็น object ที่่ใช้ในการส่งผ่านข้อมูลในลักษณะที่แตกต่างกันออกไป โดยในการส่งผ่านข้อมูลจะแบ่งได้เป็น 3 กรณี คือ

  • การส่งผ่านค่าจาก Controller ไปยัง View
  • การส่งผ่านค่าจาก Controller หนึ่ง ไปยัง Controller อื่น
  • การส่งค่าระหว่าง Action หนึ่ง ไปยัง Action อื่น

โดยทั้ง 3 objects จะมีคุณสมบัติที่แตกต่างกัน ดังนี้

  1. ViewBag เป็น dynamic object ในการส่งค่าจาก controller ไปยัง view
  2. ViewData เป็น dictionary object ในการส่งค่าจาก controller ไปยัง view
  3. TempData เป็น dictionary object ในการส่งค่าข้ามกันระหว่าง controller และ action

 

การส่งผ่านข้อมูลจาก controller ไปยัง View

การส่งผ่านข้อมูลจาก Controller ไปยัง View สามารถทำได้ 3 รูปแบบ ขึ้นอยู่กับลักษณะของข้อมูลที่ต้องการส่งว่าเป็นข้อมูลลักษณะไหน มีความซับซ้อนเพียงใด แต่ละรูปแบบสามารถเขียนได้ดังนี้

controllertoview

 

ส่งผ่าน Model

การส่งผ่านข้อมูลผ่านตัว model เป็นการส่งผ่านข้อมูลผ่านตัว model ตรงๆ โดยที่ข้อมูลจะมี property ตามที่มีอยู่ใน model ที่สร้างไว้ ดังตัวอย่าง สร้าง model ของ Book และ set ค่าให้กับ property ต่างๆ และ return model Book ไปยังหน้า View

ฝั่ง Controller

public ActionResult Index()
        {
            List<ฺBook> b = new List<Book>() {
 
               new Book{ Id = 1, Title = "Harry Potter", Author= "JK. Rolling"},
               new Book{ Id = 2, Title = "Inferno", Author= "Dan Brown"}
            };
 
            return View(b);
        }

ฝั่งแสดงผล View

ประกาศ type ของ model เป็น Book หลังจากนั้นใช้ตัวแปร model ในการเข้าถึง property ต่างๆของ Model

@model MvcBook.Models.Book
<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Title)
        th>
        <th>
            @Html.DisplayNameFor(model => model.Author)
        th>
        <th>th>
    tr>
 
@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Title)
        td>
        <td>
            @Html.DisplayFor(modelItem => item.Author)
        td>
    tr>
}
 
table>

 

ส่งผ่าน ViewBag

การส่งผ่านข้อมูลด้วย ViewBag จะเป็นการส่งข้อมูลที่เป็น dynamic object เช่น string, int, float เป็นต้น ดังตัวอย่าง

ฝั่ง Controller

public ActionResult Index()
        {
            ViewBag.title = "THE DAVINCI CODE";
            return View();
        }

ฝั่งแสดงผล View

<h2>@ViewBag.Title</h2>

 

ส่งผ่าน ViewData

การส่งผ่านข้อมูลด้วย ViewData จะเป็นการส่งข้อมูลที่เป็น dictionary object เช่น List, Enumerable, array เป็นต้น ดังตัวอย่าง

ฝั่ง Controller

public ActionResult Index()
        {
            List<string> listBook = new  List<string>();
            listBook.Add("Davinci code");
            listBook.Add("The lost symbol");
            listBook.Add("Inferno");
            ViewData["ListBook"] = listBook;
            return View();
        }

ฝั่งแสดงผล View

ในการแสดงผลข้อมูลที่เป็น dictionary object นั้นให้ทำการ cast ให้เป็น type ที่ตรงกับ type ที่ส่งมาจาก controller

<table class="table"> 
@foreach (var item in (List<string>)ViewData["ListBook"]) {
    <tr>
        <td>
            @item
        td>
    tr>
}
<table>

 

การส่งผ่านข้อมูลจาก controller/Action หนึ่ง ไปยัง controller/Action อื่น

ในการส่งผ่านข้อมูลจาก controller หนึ่ง ไปยังอีก controller หรือจาก action ไปยังอีก action จะใช้ object ที่ชื่อ TempData ในการส่งค่าระหว่างกัน ซึ่ง TempData จะเก็บข้อมูลใน session โดยเป็นการส่งค่าจาก HTTP request หนึ่งไปยัง HTTP request อื่นๆ ดังตัวอย่าง

tempdata

controller ฝั่งส่งค่า

public ActionResult Index()
        {
          TempData["data1"] = "I am from action 1";
          return RedirectToAction("Read");
         
        }

controller ฝั่งรับค่า

public string Read()
        {
            string str;
            str = TempData["data1"].ToString();
            return str;
        }

 

สรุป

ในการส่งข้อมูลระหว่าง controller กับ view และ controller/action กับ controller/action ของ ASP.NET MVC นั้น ในเบื้องต้นสามารถส่งผ่าน object ทั้ง 3 ตัว ได้แก่ ViewBag, ViewData และ TempData โดยในการเลือกใช้ให้พิจารณาลักษณะของข้อมูลที่ต้องการส่งเป็นหลัก

บทความก่อนหน้า : ASP.NET MVC Part3: สร้าง Model ด้วย Entity Framework

แหล่งอ้างอิง : 

[1] http://www.codeproject.com/Articles/476967/What-is-ViewData-ViewBag-and-TempData-MVC-Option?msg=4858421

[2] http://rachelappel.com/when-to-use-viewbag-viewdata-or-tempdata-in-asp-net-mvc-3-applications/

Share the Post:

Related Posts

ทำความรู้จักกับ Outlook บนเว็บ

Post Views: 6 Outlook เป็นเครื่องมือจัดการอีเมลและปฏิทินที่ทรงพลัง ซึ่งช่วยให้คุณมีระเบียบและเพิ่มความสามารถในการทำงาน ด้วยอินเทอร์เฟซที่ใช้งานง่าย คุณสามารถจัดการกล่องขาเข้าของคุณ นัดหมาย และทำงานร่วมกับเพื่อนร่วมงานได้อย่างง่ายดาย ฟีเจอร์ที่แข็งแกร่งของ Outlook รวมถึงแม่แบบอีเมลที่ปรับแต่งได้ ความสามารถในการค้นหาขั้นสูง และการผสานรวมที่ไร้รอยต่อกับแอปพลิเคชัน Microsoft Office อื่นๆ ไม่ว่าคุณจะเป็นมืออาชีพที่ยุ่งอยู่หรือเป็นนักเรียนที่ต้องจัดการกับภารกิจหลายอย่าง Outlook

Read More

[บันทึกกันลืม] JupyterHub Authenticated with OIDC

Post Views: 36 ต่อจากตอนที่แล้ว [บันทึกกันลืม] JupyterHub ด้วย Docker คราวนี้ ถ้าต้องการให้ ยืนยันตัวตนด้วย OpenID เช่น PSU Passport เป็นต้น ก็ให้ทำดังนี้ ในไฟล์ jupyterhub_config.py ใส่

Read More