ASP.NET MVC - ViewData
In ASP.NET MVC, ViewData is similar to ViewBag, which transfers data from Controller to View. ViewData is of Dictionary type, whereas ViewBag is of dynamic type. However, both store data in the same dictionary internally.
ViewData is a dictionary, so it contains key-value pairs where each key must be a string.
The following figure illustrates the ViewData.
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, ViewData["students"]
assigned to a studentList
where "students"
is a key and studentList
is a value.
You can now access ViewData["students"]
in the view, as shown below.
<ul>
@foreach (var std in ViewData["students"] as IList<Student>)
{
<li>
@std.StudentName
</li>
}
</ul>
Above, we retrieve the value using ViewData["students"]
and typecast it to an appropriate data type.
You can also add KeyValuePair
objects into the 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();
}
- ViewData transfers data from the Controller to View, not vice-versa.
- ViewData is a dictionary type.
- ViewData's life only lasts during the current HTTP request. ViewData values will be cleared if redirection occurs.
- ViewData value must be typecast to an appropriate type before using it.
- ViewBag internally inserts data into ViewData dictionary. So the key of ViewData and property of ViewBag must NOT match.