View视图职责是向用户提供界面。负责根据提供的模型数据,生成准备提供给用户的格式界面。
支持多种视图引擎(Razor和ASPX视图引擎是官方默认给出的,其实还支持其它N种视图引擎,甚至你自己都可以写一套视图引擎)
View和Action之间数据传递(前后台数据传递)
弱类型 ViewData[""]
动态型 ViewBag //dynamic
动态类型Model
后台:return View(data); //存入 ViewData.Model
前台:Model //其实就是 WebViewPage.Model
@using 命名空间
强类型View
//Control Action public ActionResult Index() { return View(new User { UserName = "郭靖" });//ViewData.Model属性 }
//Index.cshtml
@model MvcApplication.Models.User
<div>@Model.UserName</div>
Razor视图引擎 语法
Razor为视图提供精简的语法,最大限度减少了语法和额外字符串
- Razor通过理解标记的结构来实现代码和标记之间的顺畅切换。
- @核心转换字符,用来 标记-代码 的转换字符串。
语境A:
@{ string schoolName="湖南第一师范";}
语境B:
Razor引擎识别 @ 和 <>html</>
Razor 语法
Razor表达式自动使用了HTML编码
如果先向浏览器输出源html代码, 则使用System.Web.IHtmlString: @Html.Raw("<p>zouyujie</p>")
输出结果zouyujuie
html源码
JS字符串编码
<script> alert('@Ajax.JavaScriptStringEncode(ViewBag.UserName)');</script>
结果:
@代码块
@{ string s ="zouyujie"; int age =26; } @{Html.RenderPartial("TestPartial");}//调用无返回值方法
注释:@* ............*@
调用泛型方法:@(Html.SomeMethod<User>());
混合代码与文本:
@if(1==1){ <text>我要输出文本在这里!</text> @:我要输出文本在这里! }
@转义:@@
操作web内置对象:@Request.RawUrl @Response.Write
@作用域与html标记混合使用:
@{ string userName="刘邦"; <p>@userName</p>
}
在@作用域中输出未转义的 HTML 代码
1.使用字符串描述输出
@{ string strHtm="<p>你好~</p>"; @strHtml }
2.使用HTMLHelper输出
@{ @Html.Raw("<p>哇哈哈哈~</p>"); }
3.使用HtmlString类输出
@{ HtmlString htm =new HtmlString("<p>哈哈</p>"); @htm }
4.使用MvcHtmlString输出
@{ var strHtml=MvcHtmlString.Create("<p>哈哈~</p>"); @strHtml }
数据类型转换
用As....()方法转换 ,如:@("120".AsInt())
数值类型判断
用IsInt()方法,如 @(strAge.IsInt()?"是":"否")
路径转换
用Href()方法,如: @Href("~/Home/Index");
using System.Web.WebPages;//内部 为 string 扩展了很多 As..方法
HtmlHelper重用:相当于是在 视图中定义方法
@helper List(List<string> dogs){ <ul> @foreach (string s in dogs) { <li>@s</li> } </ul> }@List(new List<string>(){"ruiky","lisa","lucy"})
Razor 布局 – 整体视图模板
应用整体模板视图
1.@RenderBody() //模板页里的占位符
2.@{
Layout = "~/Views/Shared/SiteLayout.cshtml";
View.Title="User List";
}
<p>子页所有html代码都将替换到 模板页的@RenderBody()处</p>
应用整体视图模板 - 多个"占位符"
3.模板页多个节:
<footer>@RenderSection("Footer")</footer>
子页面定义节点:
@section Footer{ <b>我们也要加入了!</b> }
模板页判断是否为布局节方法,IsSectionDeined
@if(IsSectionDefined("Footer")){ @RenderSection("Footer"); }else { <b>“子页面”没有Footer~</b> }
Razor 布局 – ViewStart
每个子页面都使用一个Layout指定布局。如果多个视图都用同一个布局就会产生冗余,修改维护麻烦。
_ViewStart.cshtml 可解决此问题
此文件代码优先于同目录及子目录下任何视图代码执行
View目录下自动添加的_ViewStart.cshtml
@{ Layout = "~/Views/Shared/_Layout.cshtml"; }
有了它,就可以为某个文件夹下所有的视图添加相同的视图布局了
因为这个文件代码优先于任何视图,所以任何一个视图都可以重写LayOut属性来指定自己想要的模板布局页面。
Razor 布局 – 分布视图
Action方法可以通过 PartialView方法以 PartialViewResult形式返回分部视图
一般用在Ajax请求部分代码
Controller
public ActionResult PartialViewTest() { ViewData["Msg"] = "Hello world!"; return PartialView(); }
PartialViewTest.cshtml
<div>@ViewData["Msg"] </div>
Index.cshtml
<div id="divTest"> @{Html.RenderAction("PartialViewTest");}</div>
视图引擎
“仅仅是一个尖括号生成器而已”
此图仅仅为了强调:
1.视图引擎发挥作用的地方,它紧跟在Action方法执行后.
它的目的是获取从控制器传递的数据,并生成经过格式化的输出。
2.控制器并不渲染视图,它仅仅准备数据(Model)并通过ViewResult 实例来决定调用哪个视图。
视图引擎接口 IViewEngine
public interface IViewEngine { ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache); ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache); void ReleaseView(ControllerContext controllerContext, IView view);
}
ViewEngineResult属性
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" />
MVC视图的“秘密”
其实我们的cshtml视图页面,在被访问的时候,也编译成了页面类,继承于:WebViewPage<T>
在View页面,添加代码
<div>@{Response.Write(this.GetType().Assembly.Location);}</div>
运行结果:C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\c8628c1b\abb1511c\App_Web_ceor5kns.dll
用reflector反编译工具查看这个dll
cshtml页面里的所有的代码,都编译到 这个类的Excute方法里了
原标题:ASP.Net MVC View(视图)
关键词:ASP.NET