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 figure illustrates the ViewData.
Note :
ViewData only transfers data from controller to view, not vice-versa. It is valid only during the current request.
The following example demonstrates how to transfer data from controller to view using ViewData.
Example: ViewData in Action method
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.
Example: Access ViewData in a Razor View
<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.
Example: Add KeyValuePair in ViewData
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.
Example: ViewBag and ViewData
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();
}
Points to Remember :
- ViewData transfers data from the Controller to View, not vice-versa.
- ViewData is derived from ViewDataDictionary which is a dictionary type.
- ViewData's life only lasts during current http request. ViewData values will be cleared if redirection occurs.
- ViewData value must be type cast before use.
- ViewBag internally inserts data into ViewData dictionary. So the key of ViewData and property of ViewBag must NOT match.