1、TempData、ViewData、ViewBag之间的区别:
区别如下:
TempData:TempDataDictionary的一个实体,保存在Session中,也是以键值对的结构存在。
ViewData:
ViewDataDictionary的一个实体,以键值对的结构存在。
ViewBag:
dynamic([daɪ'næmɪk])动态类型,能够动态解析。
如下代码:
string[] items = new string[] { "one", "two", "three" }; ViewBag.Items = items; ViewData["Items"] = items;
由调试可以发现:
ViewBag中用的是dynamic类型,因此可以自动根据数据类型转换。
<ul> @foreach (dynamic p in ViewBag.Items) { <li>The item is: @p</li> } </ul>
而ViewData中用的是object对象,要自己去强制转换类型才可以遍历使用。
<ul> @foreach (string a in (string[])ViewData["Items"]) { <li>The item is: @a</li> } </ul>
如下,有两个Action方法:
public ActionResult Index() { this.TempData["Name"] = "Julian"; return View(); }
public ActionResult Index2() { string name = this.TempData["Name"] as string; return View(); }
Index()中,给TempData添加了一个键值对。假设请求了这个Action后,接着请求Index2这个Action。则可以在Index2中,获取到TempData的键值对的信息。
有趣的是,如果再一次请求Index2,那么从TempData中读取到的Name的值为Null。
通过上面几个简单的例子,我们可以从生命周期来看:
(1).ViewData和ViewBag的生命周期和View相同,只能在当前View中使用。当本次请求结束后,就会自动清空值。
(2).TempData则可以在不同的Action中进行传值,类似Webform中的Session,TempData的值在取了一次后则会自动删除。
TempData的特性就是可以在两个Action之间传递数据,它会保存一份数据到下一个Action,并随着再下一个Action的到来而失效。所以它被用在两个Action之间来保存数据。比如,这样一个场景,你的一个Action接受一些post的数据,然后交给另一个Action来处理,并显示到页面,这时就可以使用TempData来传递这份数据。
2、左连接
-- 总结:左连接where只影向右表,右连接where只影响左表。
-- 例子:select * from tbl1 Left Join tbl2 where tbl1.ID = tbl2.ID 左连接后的检索结果是显示tbl1的所有数据和tbl2中满足where 条件的数据