1.Mvc全名是model view controller,也就是模型(model)-视图(view)-控制器(controller)的一个缩写
2.为路由配置URL匹配模式定义有着严格的约束规则,默认的ASP.NET MVC 项目添加一个通用的路由,它使用以下的url习惯来解析特定的URL请求,即分为三个部分,包含在大括号内:controller,action,id.
{controller}/{action}/{id}
注册路由使用的拓展方法是MapRoute(),在程序启动的时候注册(在App_start/RouteConfig.cs文件里)。
3.AM依赖惯例是在网站得根目录下面得view文件夹下查找这个视图文件。更确切得说,AM希望视图文件放在他们对应得控制器名字命名得文件夹中。因此,如果MVC框架想为HomeController得Index操作显示视图,那么他就要在/View/Home文件夹下查找名为Index得文件。注意,如果在View文件夹下没有找到对应得视图文件,那么AM框架就会在/View/Shared文件夹里面继续查找。
4./View/Shared文件夹是保存共享多个控制器视图得绝佳位置。(这里的跨越多个控制器的视图文件是指诸如网站页面的顶部导航栏,底部声明信息等共享部分的页面内容。)
5.视图文件包含的内容:HTML标签和代码。但它并非仅仅是HTML标签和代码,他是razor。
Razor是一种允许把代码和内容进行平滑集成的语法。尽管它引入了一些的新的符号和关键字,但是Razor并不是一种新的语法。相反,Razor允许用户使用已知的语言来编写代码。比如C#或者VB.NET,也可以使用HTML语言来编写。
6.Razor提供了两种不同的方式来区分代码和标签:代码段和代码块。
代码段:
代码段是一些简单的表达式,它们可以在一行中进行渲染,也可以和文本混合,例如:
Not Logged In:@Html.ActionLink(“Login”,”Login”)
表达式跟@之后,Razor能够只能确定左括号的结束部分。上面例子将会渲染以下的输出结果:
Not Logged In:<a href=”/Login”>Login</a>
注意,这行代码必须一直返回标记代码给视图渲染。如果编写的代码段返回了viod。这将会在执行属兔的时候出错。
代码块:
代码块是一段包含代码的视图,它只包含代码,而不是代码和标记语言的混合。Razor定义的代码块要求使用“@{}”包装。大括号中间可以不确定行数。
记住,代码块里的代码和代码段里面的代码是不一样的,前者是常规代码,必须符合当前语言的语法。例如,每行C#代码必须以“;”结尾,这与在.cs里面编写C#代码是一样的。
下面是一个典型的代码块的例子:
@{
LayouPage=”/View/Shared/Layout.cshtml”;
View.Tile=”Auction”+Model.Title;
}
代码块不能渲染任何东西,反,它允许用户编写任意没有返回值的代码。
同样,代码块里定义的变量可能被同一个域中的代码段使用。像foreach循环体里定义的变相量只能被容器内的代码访问,而定义在视图顶部的变量可以被相同视图中的代码块和代码段访问。
为了更好的说明这个问题,先看一下包含多个变量的视图文件:
1 @{ 2 3 //整个视图都可以访问title和bids变量 4 5 var title=Model.Title; 6 7 var bids=Model.Bids; 8 9 } 10 11 12 13 <h1>@title</h1> 14 15 <div class=”items”> 16 17 <!--遍历bids变量中的对象集合--> 18 19 @foreach(var bid in bids){ 20 21 <!--bid变量只能在foreach循环中使用--> 22 23 <div class=”bid”> 24 25 <span class=”bidder”>@bid.Username</span> 26 27 <span class=”amout”>@bid.Amount</span> 28 29 }
<!--将会抛出错误,当前范围内不存在bid变量-->
<div>Last Bid Amount:@bid.Amount</div>
</div>
代码块是一种可以在模板中执行代码但是又不会返回任何值给视图的方式,与代码段不同的是,它不需要返回值,视图会完全忽略代码块的返回值。
7.布局
Razor通过layouts维护网站外观布局的一致性,使用布局,单个视图定义了整个网站的布局和样式,就像模板一样被其他视图使用。
布局模板包含基本你的标签(Scripts,css以及诸如导航和内容容器等HTML元素),可以指定渲染视图内容的位,网站中的每个视图可以引用这个布局,只包括内容,位置符合布局里约定的视图。(布局机制:类似于AF里的Master Page母版页机制,可以定义网站全局的布局样式,每个页面引用嵌套在全局的布局中。)
Razor的基本布局文件如下(Layout.cshtml):
<!DOCTYPE html>
<html lang=”en”>
<head>
<meta charset=”utf-8” />
<title>@View.Title</title>
</head>
<body>
<div class=”header”>
@RenderSection(“header”)
</div>
@RenderBody()
<div class=”footer”>
@RenderSection(“Footer”)
</div>
</body>
</html>
布局文件包含HTML内容,它定义了整个网站的HTML结构,依赖于一些变量(如@View.Title)和帮助函数(如@RenderSection{[Section Name]}和@RenderBody())来进行单个的视图交互。一旦Razor布局定义完成。视图引用当前布局以后就可以定义自己的段落内容了。
下面是视图页面引用当前页面布局文件_Layout.cshtml:
@{ Layout=”~/_Layout.cshtml”}
@section Header{
<h1>EBuy Online Auction Site</h1>
}
@section Footer{
Copyright @DateTime.Now.Year
}
<div class=”main”>
this is the main content.
</div>
Razor布局和内容视图像披萨一样的组合在一起,每一个块定义页面的特定部分,当所有的小块组合在一起的时候,就可以展现出一个完整的页面。
8.部分视图
虽然布局通过重用部分HTML代码提供了维护网站外观布局的一致性方法,但是在某些场景还是无法处理的。这就需要一些特定的方法。
最常见的场景就是在网站中的多个位置显示高级别的信息。
列如:EBuy交易网站可能要显示一个交易列表——只显示交易的名称。当前价格和一段摘要,而且可能需要在网站的多个页面显示,如搜索页面,网站的主页。
AM通过部分视图可以支持这些场景。
部分视图就是用来显示特定标签代码的小视图,它属于大视图的一部风,下面的代码演示了上面提到的交易到达交易列表的部分视图代码结构:
@model Auction
<div>
<a href=”@Model.url”><img src=”@Model.ImageUrl” />
</a>
<h4><a href=”@Model.Url”>@Model.Title</a></h4>
<p>Current Price:@Model.CurrentPrice</p>
</div>
注意,为了以后可以方便的使用视图,最好先建立的视图文件放在/View/Shared(一个单独的视图文件夹),然后用AM自带的HTML帮助方法来(这个方法可以把部分视图作为另一个视图来渲染)调用它。
下面的代码会在Auction集合里进行迭代,然后使用部分视图渲染每个交易信息:
@model IEnumerable<Auction>
<h2>Search Results</h2>
@foreach(var auction in Model)
{
@Html.Partial("Auction",auction)
}
注意,Html.Partial()帮助方法的第一个参数是一个视图的名字,并不包括拓展文件名后缀。这是因为Html.Partial()帮助方法的基础是强大的AM视图引擎。渲染部分视图的方式和控制器中操作方法调用View()方法返回视图结果的过程十分相似。引擎使用视图名称去查找并渲染特定的视图。
同样,部分视图的查找和执行过程与View()方法十分类似。唯一的区别就是部分视图表示的是大视图的一部分。
与View(_View Name_,_[Model]_)方法一样,Html.Partial()帮助方法的第二个参数接受的是部分视图的模型,这个参数不是必须的,如果不指定,就使用调用Html.Partial()的视图的模型。例如,如果第二个参数没有传递。则AM会传递原来View视图的Model属性(IEnumerable<Auction>).
上面的列子展示了如何重用部分视图以减少网站的重复代码以及复杂性,部分渲染十分有用,它也是唯一一种使用部分视图的方法。后面将介绍如何使用部分视图与Ajax进行交互。
9.mvc架构依赖模型视图和控制器,控制器充当交警的角色,协调系统的不同部分执行不同的应用处理逻辑。这些处理可能会返回一些特定的数据给用户,但是,显示数据的工作却不属于控制器!!!这个是视图的职责。
10.AM提供了两种方式在mvc边界传递数据,ViewData和TempDate.所以,从控制器向视图传递数据就变得非常简单,只需要在控制器里面赋值就可以了。下面的代码来自HomeController.cs:
11.总体学习的时候如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace TestMvc.Controllers
{
public class HomeController : Controller
{
//在mvc架构模式的上下文里,控制器英勇用户的输入(比如,用户点击“保存”按钮),并协调模型,视图以及(经常访问的数据层)。在ASP.NET MVC里面,控制器就是包含被路由器框架处理请求时调用的方法的类。
//控制器类里面的方法(控制器的操作)做了处理请求过程中的主要工作。
//ASP.NET MVC 框架十分关注控制器操作,因为其包含了处理请求的实际逻辑代码。
//例如,HomeController类包含三个操作:Index,About和Contact。然而,假设默认的路由模式为{controller}/{action}/{id},当第一个请求的url是/Home/About时,路由框架会决定由HomeController类中的About方法来处理这个请求。随后,ASP.NET MVC 会创建一个HomeController的实例,并执行About()方法。
//控制器的任务是告诉AM(简写)框架下一步该做什么,而不是做什么。这个沟通过程通过使用+ActionResult+s来实现,返回值就是控制器提供的操作。
//例如:当控制器决定如何下显示视图的时候,他会告诉AM框架通过返回ViewResult来展示视图,而不是自己渲染视图。这种耦合的设计。也是操作中“分离关注点”原则的直接体现(应该干什么和怎么干)。
//尽管每个控制器的操作都要返回ActionResult,但是大部分时间都不需要你手动完成,相反,只需要使用System.Web.Mvc.Controller基类提供的帮助方法即可。mvc框架提供了各种情况的操作结果类型,我们可以自由决定使用那种类型。
//虽然所有的操作都是要求提供操作结果以决定下一步请求的处理结果,但是并不是所有的控制器操作操作都需要制定它们的返回类型。控制器操作可以指定任何ActionResult子类作为返回类型,甚至别的任意类型。
//当AM框架遇到一个非ActionResult类型作为返回控制器操作结果时,会自动在ContentResult里进行包装并渲染原始的内容。
//操作器操作,当单独来看时,和别的方法没什么不同。事实上,当执行操作的时候,控制器操作甚至可以使用AM请求消息发送过来的参数。这种功能成为“模型绑定”,而且也时AM最强大,最有用的特性。
//传统的ASP.NET传值方式包括url传值,session传值,视图状态传值以及数据库,文件传值等。
//模型绑定,可以避免大量的显示代码,而且使用方便哦。(得重点复习一下)
//模型绑定尽管没有访问Request字典,但这些参数任然十分重要,因为它们仍然与Request对象里的值一一对应。Request对象不是AM模型绑定器获取值的唯一方式。事实上,MVC框架可以从几个地方获取查找需要的值,比如,路由数据,查询字符串参数,Post提交的数据值,甚至一些序列化的JSON对象中。(需要了解一下)
//操作过滤器通过更加简单强大的机制去修改或者增强AM管道,在特定的点注入逻辑,帮助处理贯穿程序中各个模块的横切关注点问题。应用日志就是典型的横切关注点的例子-无论组件的主要职责是什么,日志贯穿于应用的任何模块。
//操作过滤器逻辑首先通过将ActionFilterAttribute属性标记到操作上来影响操作的执行,可以保护任何未授权的访问操作。
//操作过滤器是网站中应用定制逻辑很好的方式,可以通过拓展ActionFilterAttribute或任意一个AM过滤器来创建自己的操作过滤器。
public ActionResult Index()
{
return View();
}
//在AM框架中,想要返回给用户HTML的控制器操作的时候,就要返回ActionResult类型的ViewResult实例,ActionResult知道如何渲染应答效果。当渲染视图的时候,AM将会使用控制器提供的名字。
public ActionResult About()
{
//通过VieBag属性把数据传递给视图,然后ASP.NET MVC 框架通过调用View()方法来显示名为“About”的视图,这个操作返回一个ViewResult类的操作结果。
ViewBag.Message = "这是陈宇设计的界面!";
return View();
}
public ActionResult Contact()
{
ViewBag.Message = "Your contact page.";
return View();
}
//上面的函数Contact会帮助View()来创建ViewResult。无参调用View(),和上面的函数一样,AM会找到一个和当前操作一样的视图名字。就是在根目录的View下可以额找到。
}
}
12.模型包含了整个程序的所有业务逻辑,而且每个程序的业务逻辑千差万别。
从技术角度来说,模型由属性暴露数据,方法封装业务逻辑类组成。这些类大小各异,最常见的列子就是“数据模型”和“域模型”,它们的首要职责就是负责管理数据。
列入,下面的代码展示了Auction类——这个模型将会驱动整个EBuy网站:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace TestMvc.Models
{
public class Auction
{
public long Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public decimal StartPrice { get; set; }
public decimal CurrentPrice { get; set; }
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
}
}
在本书中,我们将会给Auction类添加各种各样的功能和行为,比如验证,这段代码完全可以便是”Auction”模型类。
13.注意每个AM请求都会包括三样东西:路由,控制器和视图。(模型不是必须的。)
路由:
要弄清楚你想要为某项功能定义的路由模式,首先就要知道自己希望的那个功能的URL的样子。在这个列子里面,将会选择一个相对标准的URLAuction/Detail/[Auction ID] 例如,http://www.ebuy.biz/Auction/Detail/123.(很显然,默认路由已经支持这个URl了)
控制器:
接下来就要创建包含处理请求的操作方法的控制器。
因为控制器只是实现了AM控制器接口的类,所以也可以向”Controllers”文件夹添加继承了System.Web.Mvc.Controller的新类,然后在新类中添加控制器操作代码,然后,Visual Studio 提供的向导工具完成大部分的创建控制器的工作。仅仅需要点击右键“Controller”文件夹,然后选择“添加”->“控制器。。”菜单选项,然后就会弹出对应的对话框了。
注意,所有控制器名称的命名都得以Controller结束,这样可以方便AM来调用。
视图:
控制器操作代码编写好并且可以向视图提供数据了,现在开始创建视图文件。注意,默认名字是之前创建的控制器的名字
14.验证:
作用:如何在用户访问控制器之前验证他们的身份以保护网站的安全。
安全和身份验证是每个web应用程序必须面对的问题,有些时候需要对某些页面进行身份验证,有时候需要对整个网站的身份进行验证。有时候需要对特定的用户(或者用户组)进行限制以阻止未授权的用户访问网站。
传统的ASP.NET网站添加身份的验证方式就是从web.config中添加设置。遗憾的是,AM不支持这种方式。AM程序依赖于控制器操作,而不是物理页面。相反,AM框架提供了AuthorizeAttribute标记属性,它可以直接应用到每个控制器操作(或者所有的控制器上面),限制只有验证通过的用户,特定的用户或者用户角色才可以访问,以下是一个显示当前用户的控制器操作。
15.View.Bag可以在视图和控制器之间传递数据,也可以在视图和布局之间·传递数据
16.@RenderBody()占位符,相当于webform中contentplaceholder。