View的约定
1.根据约定,Views目录下包含着每一个与Controller同名但是没有像Controller后缀的文件夹;因此对于控制器HomeController就对应在views目录下有个目录名为Home;
2.对于controller目录,在每个对应的View下都有若干个与controller内方法同名的view文件。这样view就与action方法有了基本的关联。
ViewData与ViewBag
1.从技术上讲,数据通过叫做ViewData的特殊集合类ViewDataDictionary来从controller传递到views的;
ex:ViewData[“CurrentTime”] = DateTime.Now;
2.ViewBag是对ViewData的一种动态封装,它可以像以下那样赋值;
ex:ViewBag.CurrentTime = DateTime.Now;
3.在对ViewBag与ViewData的选择上,实际上没有选择哪一个是最好,因为,ViewBag只是对于ViewData的语法糖,它们从技术的优越性上讲是一致的;这可以根据个人习惯而选择。
4.它们之间的不同
强类型视图
1.在你的Controller中,代码可能如下:
public ActionResult List() {
var albums = new List<Album>();
for(int i = ; i < ; i++) {
albums.Add(new Album {Title = "Product " + i});
}
ViewBag.Albums = albums;
return View();
}
而在View中
<ul>
@foreach (Album a in (ViewBag.Albums as IEnumerable<Album>)) {
<li>@a.Title</li>
}
</ul>
2.在Controller,你也可以不用ViewBag,而直接返回一个集合实体给View,这时就得添加引用了
ex:return View(albums)
而在View中,你只需要标记一下刚才传过来的实体类型,就可直接使用Model了
视图模型
1.问题:当一个视图需要展示不同的数据,而这些数据并不直接来自于一个领域模型
2.解决:
Razor视图引擎
1.提供一种干净、轻量级、简单的视图引擎,它并不包含像Web Forms视图引擎那样的不整齐的句法。
2.提供了流畅的句法,把语法结构和额外特性压缩到最小,在你和你的视图标记之间尽可能的提供最少的句法,在代码和html标签中尽可能得提供平滑的过度。
ex:
@{
var items = new string[] {"one", "two", "three"};
}
<html>
<head><title>Sample View</title></head>
<body>
<h1>Listing @items.Length items.</h1>
<ul>
@foreach(var item in items) {
<li>The item name is @item.</li>
} </ul></html>
3.语法
在Razor中的关键转义字符就是@,@用来从代码到标记的转化。
特性
1.HTML的封装
2.代码块
@foreach(var item in stuff) {<li>The item name is @item.</li>}
Razor理解HTML标记的结构,当<li>标签关闭时,它能够自动转换为代码,我们不需要来再用大括号来声明<li>便签的结束。
3.注释
@*
This is a multiline server side comment.
@if (showMessage) {
<h1>@ViewBag.Message</h1>
}
All of this is commented out.
*@
4.布局