第3章 视图
概述
视图的作用
渲染HTML界面
控制器向视图传递数据
ViewBag.
模型,模型视图. @model ProjectName.Models.something //完全限定
通过在~/Views/web.config 文件中添加namespace来避免每次使用完全限定
视图约定
目录/文件名称/选择
return View(); //与控制器动作同名的视图
return View("Else");//指定控制器下Else视图
return View("~Views/Con1/Index.cshtml"); //指定完整路径
强类型视图
使用模型对象等可以获得智能感知/编译器检查等好处
return View(someModel); //传递模型对象
Razor语法
HTML编码
Razor表达式用HTML自动编码,并不会显示HTML标记
若要显示HTML标记可以使用视图辅助类(@HTML,IHtmlString接口的实例)
若要显示不经过HTML编码的文本,使用HtmlString的实例或者Html.Raw(sometext);
在JavaScript中使用用户提供的Razor变量值时,要使用JavaScript字符串编码而不仅仅是HTML编码,要使用@Ajax.JavaScriptStringEncode()方法对用户输入进行编码.这样可避免XSS攻击.如:
<script>
$(function(){
var message = 'Hello @Ajax.JavaScriptStringEncode(ViewBag.Name)';
$("#message").html(message).show('slow');
});
</script>
代码块
@{ something big }
隐式/显示表达式
<span>@model.Name</span> <span> 1 + 2 = @(1+2) </span>
文本和标记结合
<span>Item @item.Name</span>
代码块/标记结合
@if(show){<text>Show Text</text>}
组合方式
代码块,文本,标记,显示表达式,隐式表达式,视图辅助类
转义与注释
@@显示"@", @* something *@ 注释
调用泛型方法
由于泛型方法中使用了尖括号,需要使用显示表达式
RenderBody
语法:
@RenderBody() //视图在布局中的位置
RenderSection
语法:
@section Footer { something } //在布局中定义
@RenderSection("Footer",required:false) //在视图中使用
@if(IsSectionDefined("Footer"){ ... } //判断节是否有定义
说明:
默认使用节时,required不需要写,所有需要每个视图都要提供节定义.
ViewStart
说明:
_ViewStart.cshtml //指定默认布局,视图中不指定时使用此设置
@{ Layout="~/Views/Shared/_Layout.cshtml"; } //指定视图
PartialView
语法:
C#:Return PartialView([ViewName]);
说明:
部分视图不能指定布局
可以结合Ajax使用,get时返回部分视图内容并加载到相应元素