在MVC中,從控制器到視圖,傳遞數據,可以使用 ViewData 和 ViewBag;同樣從視圖到控制器,傳遞數據,可以使用Post,QueryString,或者隱藏域;最后從控制器到控制器,傳遞數據可以使用TempData。
注意:當然,從控制器到視圖,傳遞數據,還可以使用TempData的。
我們來一一看一下:
1.ViewBag方式,從控制器到視圖傳遞數據:
ViewBag is a dynamic property (a new C# 4.0 feature) which means it has no pre-defined properties. ViewBag is a wrapper around the ViewData that exposes the ViewData dictionary as a dynamic object. ViewBag is slower than ViewData and it does not require any type of typecasting for the complex data type. Visual Studio cannot provide IntelliSense support for the dynamic objects, so error is not visible at the design time.
ViewBag是C# 4.0中動態的屬性,Viewbag是ViewData的包裝,Vewbag比ViewData慢,它不需要對復雜類型進行轉換,VS不能對動態類型,提供智能提示,所以動態對象的錯誤在編譯期間是發現不了的
public ActionResult Index()
{
ViewBag.TimeNow = DateTime.Now;
return View();
}
對應的Index視圖:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
當前時間是【ViewBag傳遞數據】: @ViewBag.TimeNow
</div>
</body>
</html>
結果是:
2.ViewData方式,從控制器到視圖,傳遞數據
ViewData is a dictionary object used to pass data from the controller to view in the form of Key-Value pair. ViewData is derivative of the ViewDataDictionary class. ViewData is introduced in MVC 1.0. ViewData requires type casting for complex data types and if redirection occurs, itS value becomes NULL.
ViewData是一個dictionary 對象,用來以鍵值對的方式,從控制器向視圖傳遞數據,ViewData是ViewDataDictionary 的衍生物,最早是在MVC1.0中引入的,對于復雜類型來說,ViewData需要類型轉換;并且如果在方法中,有redirection 出現的話,ViewData里面所包含的數據,就會變成空的。
public ActionResult Index()
{
ViewBag.TimeNow = DateTime.Now;
ViewData["MyTime"] = DateTime.Now;
return View();
}
對應的視圖:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
當前時間是【ViewBag傳遞數據】: @ViewBag.TimeNow <br/>
當前時間是【ViewData傳遞數據】: @ViewData["MyTime"]
</div>
</body>
</html>
結果是:
3.TempData方式,從控制器到視圖,傳遞數據:
public ActionResult Index()
{
ViewBag.TimeNow = DateTime.Now;
ViewData["MyTime"] = DateTime.Now;
TempData["TempData"] = DateTime.Now;
return View();
}
對應的視圖:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
當前時間是【ViewBag傳遞數據】: @ViewBag.TimeNow <br/>
當前時間是【ViewData傳遞數據】: @ViewData["MyTime"]<br/>
當前時間是【TempData傳遞數據】: @TempData["TempData"]<br />
</div>
</body>
</html>
結果是:
小結:從上面,我們可以看出,ViewBag,ViewData,TempData都可以,從控制器向視圖傳遞數據。
那么,我們就有疑問了,他們三者是不是可以共享數據呢?,我們來驗證一下:
我們修改一下,控制器的代碼:
public ActionResult Index()
{
ViewBag.TimeNow = DateTime.Now;
//ViewData["MyTime"] = DateTime.Now;
//TempData["TempData"] = DateTime.Now;
return View();
}
注釋,兩行代碼,然后視圖中:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
當前時間是【ViewBag傳遞數據】: @ViewBag.TimeNow <br/>
當前時間是【ViewData傳遞數據】: @ViewData["TimeNow"]<br/>
當前時間是【TempData傳遞數據】: @TempData["TimeNow"]<br />
</div>
</body>
</html>
結果是:
從上面的圖中,可以看到,ViewBag的數據是可以和ViewData共享的,但是不能和TempData共享
那么,ViewData的數據,是否可以和ViewBag,TempData共享呢?我們繼續驗證一下:
修改控制器的方法:
public ActionResult Index()
{
//ViewBag.TimeNow = DateTime.Now;
ViewData["MyTime"] = DateTime.Now;
//TempData["TempData"] = DateTime.Now;
return View();
}
對應的視圖:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<div>
當前時間是【ViewBag傳遞數據】: @ViewBag.MyTime <br/>
當前時間是【ViewData傳遞數據】: @ViewData["MyTime"]<br/>
當前時間是【TempData傳遞數據】: @TempData["MyTime"]<br />
</div>
</body>
</html>
結果是:
可以看出,ViewData和Viewbag也是可以共享數據的,但是ViewBag和VIewData都不能和TempData共享數據
所以階段性總結一下:
1.ViewData和Viewbag也是可以共享數據的,但是ViewBag和VIewData都不能和TempData共享數據;
2..ViewData和Viewbag還有TempData都是可以從控制器向視圖傳遞數據的。
TempData的作用,還有哪些???
我們來看下:
在控制器中添加一個方法,并且加相應的視圖:
public class HomeController : Controller
{
// GET: Home
public ActionResult Index()
{
ViewBag.TimeNow = DateTime.Now;
ViewData["MyTime"] = DateTime.Now;
TempData["TempData"] = DateTime.Now;
return View();
}
public ActionResult DataVIew()
{
ViewBag.TempView = ViewBag.TimeNow;
ViewData["TempViewDataTime"] = ViewData["MyTime"];
TempData["TempViewData"] = TempData["TempData"];
return View();
}
}
DataView視圖:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>DataVIew</title>
</head>
<body>
<div>
當前時間是【ViewBag傳遞數據】: @ViewBag.TempView <br />
當前時間是【ViewData傳遞數據】: @ViewData["TempViewDataTime"]<br />
當前時間是【TempData傳遞數據】: @TempData["TempViewData"]<br />
</div>
</body>
</html>
接著運行DataView頁面:
沒有傳遞過來。。。???
我們再修改一下,控制器的方法:
// GET: Home
public ActionResult Index()
{
ViewBag.TimeNow = DateTime.Now;
ViewData["MyTime"] = DateTime.Now;
TempData["TempData"] = DateTime.Now;
return RedirectToAction("DataVIew");
}
public ActionResult DataVIew()
{
ViewBag.TempView = ViewBag.TimeNow;
ViewData["TempViewDataTime"] = ViewData["MyTime"];
TempData["TempViewData"] = TempData["TempData"];
return View();
}
然后,我們運行程序,默認是Index方法,然后因為有,RedirectToAction("DataVIew");,就會跳到DataVIew這個方法中,所以結果是:
可以得出結論:TempData還可以在控制器之間傳遞數據,而ViewBag和VIewData不能。
最終結論:
1.ViewData和Viewbag也是可以共享數據的,但是ViewBag和VIewData都不能和TempData共享數據;
2..ViewData和Viewbag還有TempData都是可以從控制器向視圖傳遞數據的。
3.TempData還可以在控制器之間傳遞數據,而ViewBag和VIewData不能。
文章列表