sarpay
9/10/2018 - 11:31 AM

ViewData

ViewData is similar to ViewBag. It is useful in transferring data from Controller to View.
ViewData is a dictionary which can contain key-value pairs where each key must be string.

The following example demonstrates how to transfer data from controller to view using ViewData.

public ActionResult Index()
{
    IList<Student> studentList = new List<Student>();
    studentList.Add(new Student(){ StudentName = "Bill" });
    studentList.Add(new Student(){ StudentName = "Steve" });
    studentList.Add(new Student(){ StudentName = "Ram" });

    ViewData["students"] = studentList;
  
    return View();
}

In the above example, we have added a student list with the key "students" in the ViewData dictionary. 
So now, the student list can be accessed in a view as shown below.

<ul>
@foreach (var std in ViewData["students"] as IList<Student>)
{
    <li>
        @std.StudentName
    </li>
}
</ul>


Please notice that we must cast ViewData values to the appropriate data type.
You can also add a KeyValuePair into ViewData as shown below.

public ActionResult Index()
{
    ViewData.Add("Id", 1);
    ViewData.Add(new KeyValuePair<string, object>("Name", "Bill"));
    ViewData.Add(new KeyValuePair<string, object>("Age", 20));

    return View();
}

ViewData and ViewBag both use the same dictionary internally. 
So you cannot have ViewData Key matches with the property name of ViewBag, 
otherwise it will throw a runtime exception.

public ActionResult Index()
{
    ViewBag.Id = 1;

    ViewData.Add("Id", 1); // throw runtime exception as it already has "Id" key
    ViewData.Add(new KeyValuePair<string, object>("Name", "Bill"));
    ViewData.Add(new KeyValuePair<string, object>("Age", 20));

    return View();
}