·Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据类。 · Views: 应用程序动态生成 HTML所使用的模板文件。 · Controllers: 处理浏览器的请求,取得数据模型,而后指定要响应浏览器请求的视图模板。 控制器负责给任何数据或者对象提供一个必需的视图模板,用这个视图模板来Render返回给浏览器的HTML。 最佳作法是:一个视图模板应该永远不会执行业务逻辑或者直接和数据库进行交互。相应的,一个视图模板应该只和控制器所提供的数据进行交互。 维持这种"隔离关系"能够帮助,保持代码的干净、测试性和更易维护 Windows Azure是微软基于云计算的操做系统,和Azure Services Platform同样,是微软“软件和服务”技术的名称。 Windows Azure的主要目标是为开发者提供一个平台,帮助开发可运行在云服务器、数据中心、Web和PC上的应用程序。 云计算的开发者能使用微软全球数据中心的储存、计算能力和网络基础服务。 Azure服务平台包括了如下主要组件:Windows Azure;Microsoft SQL数据库服务,Microsoft .Net服务;用于分享、储存和同步文件的Live服务;针对商业的Microsoft SharePoint和Microsoft Dynamics CRM服务。 MapRoute方法是使用HTTP请求路由查找到正确的控制器(controller)和行动方法,并提供了可选ID的参数。 MapRoute方法也被用于经过HtmlHelpers如ActionLink的控制器,操做方法及任何路由数据,以生成URL @Html.ActionLink("Edit", "Edit", new { id=item.ID }) ActionLink是一个帮助方法(Helper),便于动态生成指向Controller中操做方法 的HTML 超连接连接。 ActionLink方法的第一个参数是想要呈现的连接文本 (例如,<a>Edit Me</a>)。 第二个参数是要调用的操做方法的名称(在本例中, Edit方法)。 最后一个参数是一个匿名对象(anonymous object),用来生成路由数据 ASP.NET MVC会调用不一样的控制器类(和其内部不一样的操做方法)这取决于传入URL。 所使用的ASP.NET MVC的默认URL路由逻辑使用这样的格式来断定哪些代码以便调用: /[Controller]/[ActionName]/[Parameters] URL 的第一部分肯定要执行的控制器类。因此 /HelloWorld 映射到 HelloWorldController 类。 URL 的第二部分肯定的行动方法上要执行的类。因此 /HelloWorld/Index 会致使 Index 的方法 HelloWorldController 类来执行。 请注意,咱们只有以浏览到 /HelloWorld 和 Index 方法在默认状况下。这是由于一种方法称为 Index 是若是不显式指定一个称为控制器的默认方法。 URL 段 ( Parameters) 第三部分是为路由数据。 使用HttpServerUtility.HtmlEncode(对字符串进行 HTML 编码并返回已编码的字符串。)来保护应用程序的恶意输入 (即 JavaScript)。 return HttpUtility.HtmlEncode("Hello " + name + ", NumTimes is: " + numTimes); (问号) 在的 URL 是分隔符,接着的查询字符串。& 字符分隔的查询字符串。 布局模板容许您在一个地方指定您的网站的 HTML 容器布局,而后将其应用在多个页面在您的网站。 发现@RenderBody()线。 RenderBody是在您建立的全部视图特定页面都显示出来,"包装"在布局页面中的占位符。 例如,若是您选择关于连接,在RenderBody方法内部呈现Views\Home\About.cshtml视图。 实体框架 (一般称做 EF) 支持一个称为代码优先的发展模式。 代码首先容许您经过编写简单的类来建立模型对象。(这些也被称为是 POCO 类,从"纯老 CLR 对象。")而后,您可使上您的类,从而使很是干净和快速开发工做流建立的数据库。 LocalDB是轻量级的版本的 SQL Server 表示数据库引擎,按需启动和运行在用户模式下。 LocalDB 运行中的 SQL Server Express 使您可以使用数据库的.mdf文件做为特殊的执行模式。 一般状况下,LocalDB 数据库文件保存在 web 项目的App_Data文件夹中。 <add name="EFDbContext" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=SportsStore; Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\SportsStore.mdf" /> 其中,name属性必定要跟本身的DbContext类名相一致,若是此处不一致就找不到数据库了,它俩就是匹配做 用 。这样写以后EFDbContext类才会去跟该字符串指向下的数据库作映射。 其中的Data Source指定数据库类型 其中Integrated Security指的是登录类型,此处跟写“True”做用同样,就是能够以windows 身份登陆,每 次登陆你就不用输帐号密码了。若是是“false”就是指的sql server方式登陆就要帐号密码齐全。 其中Initial Catalog属性就是初始数据库名称,字面也知道个大概,我也不详细说了,至于他有没有深层次 的做用我还不知道,这不是易出错点。 其中AttachDBFilename指的是一个路径,放mdf文件的地方,上面的写法是指的该文件放在本身工程的 App_Data文件夹下面,AttachDBFilename=c:\SportsStore.mdf指的就是c盘根目录下了,因此你能够根据 这个属性来改变访问的mdf文件。 有三种方式将信息从控制器传递到视图: 做为一个强类型的模型对象。 以下这一行代码表示将一个movies列表从控制器传递到了视图中。 return View(movies.ToList()); 做为一种动态类型 (使用 @model 动态) @model指令以提供一个更干净简洁的方式来指明你想要在视图文件中引用强类型模型类 @model MvcMovie.Models.Movie 此@model声明使得控制器能够将强类型的Model对象传递给View视图, 从而您能够在视图里访问传递过来的强类型电影Model。 @model IEnumerable<MvcMovie.Models.Movie>此@model声明使得控制器能够将强类型的电影列表Model对象传递给View视图。 例如,在Index.cshtml模板中,在强类型的Model对象上使用foreach语句循环遍历电影列表 使用 ViewBag 数据是使用模型联编程序 采起从 URL 和传递给控制器。 控制器的数据打包成一个ViewBag对象,并将该对象传递给视图。视图而后是向用户显示为 html 格式的数据。 一个控制器可使用ViewBag对象来将数据或对象传递到视图模板中。 ViewBag是一个动态对象,它提供了一种便利的,后期绑定的方法来将信息从控制器传递到视图中。 你能够为它添加任何属性并赋上属性值。在未赋值以前该属性是不生效的,直到你赋值为止。 例如: public ActionResult Welcome(string name, int numTimes = 1) { ViewBag.Message = "Hello " + name; ViewBag.NumTimes = numTimes; return View(); } ViewBag对象中已经包含了数据,它将被自动传递给视图。 DAtaAnnotaions 的属性-- 命名空间:System.ComponentModel.DataAnnotations Required:标识该属性为必需参数,不能为空 StringLength:标识该字符串有长度限制,能够限制最小或最大长度 Range:标识该属性值范围,一般被用在数值型和日期型 RegularExpression:标识该属性将根据提供的正则表达式进行对比验证 CustomValidation:标识该属性将按照用户提供的自定义验证方法,进行数值验证 DataType属性用于指定一个比数据库内部类型更加具体的一种数据类型,但它们不是验证属性 该DisplayFormat的属性是用来显式地指定日期格式的 [StringLength (60,MinimumLength=3)] public string Title { get; set; } [Display(Name = "Release Date")] [DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] public DateTime ReleaseDate { get; set; } [RegularExpression(@"^[A-Z]+[a-zA-Z''-'\s]*$")] [Required][StringLength(30)] public string Genre { get; set; } [Range(1, 100)] [DataType(DataType.Currency)] public decimal Price { get; set; } [RegularExpression(@"^[A-Z]+[a-zA-Z''-'\s]*$")] [StringLength(5)] public string Rating { get; set; } DataType属性的优点: 浏览器能够启用HTML5功能(好比显示日历控件,本地化的货币符号,电子邮件连接,客户端输入验证等) 默认状况下,浏览器将使用基于本地区域设置的正确格式来呈现数据 DataType属性可让MVC自动选择正确的字段模板来呈现数据(DisplayFormat使用字符串模板) 一 Html.ActionLink("linkText","actionName") 该重载的第一个参数是该连接要显示的文字,第二个参数是对应的控制器的方法, 默认控制器为当前页面的控制器,若是当前页面的控制器为Products,则 Html.ActionLink("detail","Detail") 则会生成 <a href="/Products/Detail">all</a> 二 Html.ActionLink("linkText","actionName","controlName") 该重载比第一个重载多了一个参数,他指定了控制器的名称, 如Html.ActionLink("detail","Detail","Products")则会生成 <a href="Products/Detail">all</a> 三 Html.ActionLik("linkText","actionName",routeValues) routeValue能够向action传递参数,如Html.ActionLink("detail","Detail",new { id=1}) 会生成 <a href="Products/Detail/1">detail</a>, 此处假设当前的控制器是Products. 四 Html.ActionLink("linkText","actionName",routeValues,htmlAttributes) htmlAttribute能够设置<a>标签的属性, 如 Html.ActionLink("detail","Detail",new{id=1},new{ target="_blank"}) 会生成 <a href="Products/Detail/1" target="_blank">detail</a>, 须要主要的是若是写成 new{ target="_blank",class="className"}则会报错, 由于class是关键字,此处应该写成 @class="className"。 @Html.TextBoxFor(a=>a.Name)和@Html.TextBox("Name")实质是同样的 显示结果也同样 区别: 一种强类型的HtmlHelper编程方式 一种是手写字符串的方式 http协议默认先以get方式获取数据,不管是否以哪一种方式发起的,老是get方式优先,即经过get方式获取到了数据就不会再去经过post方式获取一遍,若是get方式获取不到,再以post方式获取 post和get的区别? 1. get是从服务器上获取数据,post是向服务器传送数据。 2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中能够看到。post是经过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一块儿传送到ACTION属性所指的URL地址。用户看不到这个过程。 3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。 4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,通常被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。 5. get安全性很是低,post安全性较高。可是执行效率却比Post方法好。 建议: 一、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式; 二、在作数据查询时,建议用Get方式;而在作数据添加、修改或删除时,建议用Post方式; MVC Html.AntiForgeryToken() 防止CSRF攻击 MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site request forgery)攻击的一个措施, 它跟XSS(XSS又叫CSS:Cross-Site-Script),攻击不一样,XSS通常是利用站内信任的用户在网站内插入恶意的脚本代码进行攻击, 而CSRF则是伪形成受信任用户对网站进行攻击。 ValidationSummary 控件用于在网页、消息框或在这二者中内联显示全部验证错误的摘要。 在该控件中显示的错误消息是由每一个验证控件的 ErrorMessage 属性规定的。 若是未设置验证控件的 ErrorMessage 属性,就不会为那个验证控件显示错误消息。 派生类是子类 基类是父类 基类派生子类 子类继承基类 基类是老子,派生类是儿子,若是派生类被继承了,就是有孙子了 子类(派生类) 父类(基类) 1.子类拥有父类全部的成员. 2.protected 修饰的成员只能在本类和子类中访问. 3.建立子类对象的时候,在子类对象中会为子类对象的字段开辟空间 也会为父类对象的全部字段开辟空间. 只不过父类私有的成员访问不到而已。 4.子类从父类继承父类全部的非私有成员. 5.base关键字能够调用父类的非私有成员. 6.子类的访问级别不能比父类高. 7.建立子类对象的时候,1.调用子类的构造函数 2.调用父类的构造函数 3.执行父类的构造函数 4.执行子类的构造函数. 8.子类的构造函数后面默认加了1个 :base() 经过这个调用父类的无参数的构造函数. 9.若是父类没有无参数的构造函数 将会报错,由于子类的构造函数默认会调用父类的无参数的构造函数. 10.使用base关键字能够显示的指定子类构造函数调用父类有参的构造函数. 1. 为何要调用父类的构造函数 父类的构造函数会初始化父类属性的值. 续: 1. 继承的好处:方便代码管理. 子类能够拥有父类的非私有成员 为了多态. 2. 子类的构造函数.默认会去调用父类的无参数的构造函数. 3. 显示指定子类构造函数调用的父类构造函数 base 4. 建立子类对象的内存图. 5. this 能够点出子类的全部成员和父类的非私有成员 base能够点出父类的非私有成. 只包含属性 不包含方法的类叫作实体类 把全部动做(方法和事件)放在另外的类中, 叫作控制类 DbSet 表示上下文中给定类型的全部实体的集合或可从数据库中查询的给定类型的全部实体的集合 overload是重载 override是覆盖 默认状况下BeginForm 使用POST方式提交表单数据,这意味着参数经过HTTP消息正文传递而不是经过URL查询字符串。 当你指定使用HTTP GET时,表单数据经过URL查询字符串来传递,这样能够容许用户将URL保存为书签。W3C guidelines for the use of HTTP GET推荐你应该在不会更新数据的方法中使用GET方式。 DbContext 在读取一个实体并将其呈现到页面上后就会被销毁, 当HttpPost Edit方法被调用,此时会生成一个新的请求和DbContext 实例,因此你必须手动设置实体状态为Modified, 而后当你调用SaveChanges方法时,Entity Framework 会更新数据库行的全部列,由于数据库上下文没有办法知道你到底更改了哪些属性。 弹性链接(瞬时错误的自动重试)和命令拦截(捕获全部发送到数据库的SQL查询语句并记录至日志中)