本人刚开始学asp.net mvc3,以下是学习笔记:
1、视图的作用
视图的职责是向用户提供视图界面。向它提供模型的引用后,他会将模型转换为准备提供用户的格式。在asp.net mvc中,这个过程有两部分组成,其一是检查由控制器提交的ViewDataDictionary(通过ViewData访问),另外一部分是将其内容转换为html格式。
扩展:从asp.net mvc3开始,视图数据也可以通过ViewBag属性访问。而且 ViewBag.message等同于 viewBag["message"];相对于ViewBag[]来说,ViewBag.要指定类型并且参数名称要有效. 如Viewdata["hello world"]中存放一个值,那么将不能使用ViewBag访问;又如@html.TextBox("name",ViewBag.name)将无法读取,因为C#编译器翻译时必须知道其真正的参数类型,如果其中的任何一个参数是动态的,那么编译时会出错.所以修改能让编译通过的有两种方法,其一使用ViewData[“name”],其二使用(string)ViewBag.name.
2、指定视图
指定视图非常简单,按照约定,每个控制器在views目录下都有一个对应的文件夹,其名称与控制器一样,只是没有Controller后缀名,所以控制器xxxController在views目录下对应有个名称相同的xxx视图文件夹与之相对应。
例如操作方法通过View方法返回ViewResult对象,代码如下:(默认项目的控制器HomeController的index方法)
public class HomeController : Controller
{
public ActionResult Index()
{
ViewBag.Message = "欢迎你!!";
return View();
}
return view() 操作方法返回的ViewResult对象将按照约定来确定视图,它首先在/View/ControllerName下查找与控制去名称不带Controller后缀相同的视图。通过这种方法选择的视图便是/View/Home/Index.cshtml。
默认约定也是可以重写的。如果想要Index方法渲染一个不同的试图,可以向其提供一个不同的视图名称,代码如下:
public class HomeController : Controller
{
public ActionResult Index()
{
ViewBag.Message = "欢迎你!!";
return View("notIndex");
}
它依旧是在/View/Home目录下寻找,但选择的是notIndex.cshtml作为视图。
有些情况下需要在不同的目录下寻找试图,那么将其给出完整的路径,代码如下:
public class HomeController : Controller
{
public ActionResult Index()
{
ViewBag.Message = "欢迎你!!";
return View("`/View/Example/Index.cshtml");
}
3、强类型视图
在此前有必要先了解一下什么是强类型维基百科--强类型。
强类型视图指的是在视图中就声明该视图中的Model类型,比如@model Zzjs.Expert.Entities.xxx就表示该视图中的Model是xxx类,该Model就是强类型。(引用网上相对赞同的说法)
这一不详细说明,在后台,写法主要有:
1--@model IEnumerable<MvcApplication1.Models.xxx>
2--@using MvcApplication1.Model1
@model IEnumerable<xxx>
视图的基架类型
Empty Create Delete Details Edit List 试图的样式和英文单词的表意差不多。
4、Razor视图引擎
Razor视图是Asp,net mvc3的默认视图引擎,干净 轻量级 简单 。
核心转换字符是@符号,@item.Length
Razor采用了一个简单的算法来判断一个邮箱地址,大多数情况下,所以想要输出@符号那么就得@@转义。
遇到无法翻译的用括号括起来,这样编译就不会出错,
HTML编码
<div>
@{
var items = new string[] { "one", "two", "three" };
}
<h2>Listing @items.Length item.</h2>
<ul>
@foreach (var item in items)
{
<li>This item is @item .</li>
}
</ul>
<span>wto753135@gmail.com</span><br />
<span>item_@(items.Length)</span><br />
@{
string message = "<script>alert('hacked!');</script>";
}//代码块
<span>@message</span><br />//显示<script>alert('hacked!');</script>
<span>@Html.Raw(message)</span><br />//弹框 hacked
<label id="Message"></label>
<br />
<label id="Message1"></label>
</div>
<script type="text/javascript">
$(function () {
var message = 'Hello @ViewBag.message';
$('#Message').html(message).show('slow');
});
$(function () {
var message1 = 'Hello @Ajax.JavaScriptStringEncode(ViewBag.message)';//避免xss攻击
$('#Message1').html(message1).show('slow');
});
</script>
服务器端的注释用:@*......*@
_ViewStart.cshtml文件先于任何视图代码的执行,相当于母版页。
5、指定分布视图
通过PartialView方法以及PartialViewResult的形式返回分布视图。
public class HomeController : Controller
{
public ActionResult Book()
{
ViewBag.Message = "欢迎你!!";
return PartialView();
}
这种情况下,将会渲染视图Book.cshtml.如果布局是由_ViewStart.cshtml页面指定,那么布局将无法渲染。这种分布视图在Ajax中部分更新是有用的。
asp.net mvc的生命周期如下:
HTTP响应----路由----控制器----视图结果----视图引擎----视图----结果