Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

ViewData ใน ASP.NET MVC C# คืออะไร

ViewData เป็น Dictionary ของ Objects ที่เก็บและเรียกข้อมูลโดยใช้ String เป็น Key ใช้สำหรับส่งข้อมูลจาก Controller ไป View เนื่องจาก ViewData เป็น Dictionary จึงมี Key-Value Pairs โดย Key ต้องเป็น String เสมอ ViewData ส่งข้อมูลจาก Controller ไป View เท่านั้น ไม่ใช่สองทาง Valid เฉพาะระหว่าง Current Request เท่านั้น

การเก็บข้อมูลใน ViewData

ViewData["countries"] = countriesList;

การดึงข้อมูลจาก ViewData

string country = ViewData["MyCountry"].ToString();

ViewData ไม่ให้ Compile-time Error Checking เช่น ถ้าเราสะกด Key ผิด จะไม่ได้ Compile Error จะรู้ Error ตอน Runtime เท่านั้น

Controller

using System.Collections.Generic;
using System.Web.Mvc;

namespace DemoMvcApplication.Controllers {
    public class HomeController : Controller {
        public ViewResult Index() {
            ViewData["Countries"] = new List {
                "India", "Malaysia", "Dubai", "USA", "UK"
            };
            return View();
        }
    }
}

View

@{
    ViewBag.Title = "Countries List";
}

Countries List

    @foreach(string country in (List)ViewData["Countries"]) {
  • @country
  • }

Output

ViewData ใน ASP.NET MVC C# คืออะไร

ViewData vs ViewBag vs TempData

FeatureViewDataViewBagTempData
TypeDictionary<string, object>DynamicDictionary<string, object>
SyntaxViewData["Key"]ViewBag.KeyTempData["Key"]
Compile-time Checkไม่มีไม่มีไม่มี
LifetimeCurrent RequestCurrent RequestNext Request (Survives Redirect)
Type Castingต้อง Castไม่ต้อง Castต้อง Cast
Null HandlingNull Reference ExceptionNull Reference ExceptionNull ได้

Best Practices

  • ใช้ ViewModel/Strongly Typed View แทน ViewData/ViewBag สำหรับข้อมูลหลัก (Compile-time Safety, IntelliSense, Refactoring)
  • ใช้ ViewData/ViewBag สำหรับข้อมูลเล็กๆ น้อยๆ เช่น Page Title, Breadcrumb, Flags
  • ใช้ TempData สำหรับข้อมูลที่ต้องส่งผ่าน Redirect (PRG Pattern)
  • หลีกเลี่ยง Magic Strings - ใช้ Constants หรือ nameof()

// ดีกว่า Magic Strings
public static class ViewDataKeys {
    public const string Countries = "Countries";
    public const string PageTitle = "PageTitle";
}

// Usage
ViewData[ViewDataKeys.Countries] = countries;
var title = ViewData[ViewDataKeys.PageTitle] as string;