ASP.NET MVC5 高级教程 学习笔记

来源:互联网 发布:cst2014仿真软件下载 编辑:程序博客网 时间:2024/05/18 03:36

// 本应用是ASP.NET MVC5 高级教程学习产物

// 2015-07-23


// 第一章 入门


// 第二章 控制器


// 第三章 视图
1.Install-Package Wrox.ProMvc5.Views.AlbumList
2.Install-Package Wrox.ProMvc5.Views.SpecifyingViews
// UnInstall-Package Wrox.ProMvc5.Views.SpecifyingViews
Install-Package SomePackage -Source C:\PathToThePackageDir\


// 第四章 模型
1.基架 scaffolding
2.建立属性的时候巧用  prop Tab两次
3.DDD domain-driver design 领域驱动模型 , CQRS command-query responsibility segregation 命令查询职责分离; 这两个使用的流程设计模式:库和工作单元设计模式
4.基架代码, EF数据库初始化(1.用实体框架创建数据库2.使用数据库初始化器3.播种数据库)
5.DefaultModelBinder 显示绑定(Bind,UpdateModel,TryUpdateModel)


// 第五章 表单和HTML辅助方法
1.form 标签的默认 action 当前页面,method get
2.Html.BeginForm 默认是 form方式
3.htmlAttributes 参数中 class关键字用 @class代替 , data-val 用 data_val代替
4.html渲染的 id . 编程 _
5.Html.BeginForm,Html.Lable,Html.Hidden,Html.Password,...html.Diplay,Endit Raw....,Html.ActionLink,Html.RouteLink...For结尾的强类型
6.URL (Action,Content,RouteUrl)
7.Html.Partial Html.RenderPartial(写入相应流的,效率高点),下面演示一样的效果
@{Html.RenderPartial("partialName")}
@Html.Partial("partialName")
8.Html.Action  Html.RenderAction 效果同7  涉及attribute(ChildOnlyAttribute)


// 第六章 数据注解和验证
1.在项目的"程序包管理控制台"窗口,输入"enable-migrations",回车,导致在项目中生成一个“Migrations"文件夹,其中包含两个.cs类。
2.在1中生成的Configuration.cs中修改构造函数中代码为:”AutomaticMigrationsEnabled = true;
3.保存修改后,在"程序包管理控制台"中输入"update-database",回车,再次运行即可。
4.Attribute: Remote,ScanffodColum,DisplayFormat,ReadOnly,DataType,Uhint
5.Display Order 默认为 10000


// 第七章 成员资格、授权和安全性
1.HTML编码,raw
2.全局过滤器:FilterConfig.cs filters.Add(new AuthorizeAttribute());
3.AuthorizeAttribute,AllowAnonymousAttribute,RequireHttpsAttribute
4.OAuth 和 OpenId
5.跨站脚本(XSS) Passive Injection(被动注入),Active Injection(主动注入)
脚本,html,属性值编码:Html.AttitudeEncode,Url.Encode,Javascript编码
引入: (AntiXSS库) 
<httpRuntime encoderType="System.Web.Secutity.AntiXssEncoder,System.Web,Version=4.0.0.0,Culture=netural,PublicKeyToken=b03f5f7f11d50a3a" />
<httpRuntime encoderType="System.Web.Security.AntiXss.AntiXssEncoder" />
6.跨站请求伪造(CSRF 或 XSRF) Cross-Site Request Forgery
混淆代理,幂等的GET请求,cookie盗窃(会话cookie,持久性cookie)HttpOnly组织盗窃cookie
重复提交,开放重定向, RedirectToLocal(url);
7.配置转换,看 Web.Release.config
8.配置文件customErrors    (Retail 配置, machine.config <system.web><deployment retail="true /></system.web>
retail :n. 零售;  vt. 零售; 零卖; 转述; 传播;  adj. 零售的;  


// 第8章 Ajax
1.JQuery CSS(Casdading Style Sheet) JSON(JavaScrpt Object Notation)
2.Microsoft JQuery Unobrusive Ajax 插件(Ajax辅助方法)
install-package Microsoft.jQuery.Unobtrusive.Ajax
3.HTML特性 data-,Jquery客户端验证,自定义脚本,
4.Jquery UI
install-package jQuery.UI.Combined
Jquery 自动完成
4.JSON客户端模板
install-package mustache.js
5.Bootstrap
6.CDN (Content Delivery Network) 内容分发网络
7.


// 第9章 路由
1.URL(Uniform Resource Locator) 统一资源定位符
2.URI(Uniform Resource Identifior) 统一资源标识符
3.特性路由,传统路由 , 路由匹配,尽可能多的匹配字符
4.特性路由:
内联约束:{id:int} .... {n:alpha},{n:regex(^a+$)}
默认值 : {id=2}
可选参数 :  {id?}      ,     [Route("{year}/{month?}/{day}")]
5.传统路由
1.路由定义
2.路由默认值
3.路由约束  正则默认加上 ^ $
6.路由命名 routeName
7.MVC区域,特性区域,区域的注册顺序
8.catch-all 参数  routes.MapRoute("callallroute", "query/{query-name}/{*extrastuff}");
9.StopRoutingHandler()  routes.Add(new Route("{resource}.axd/{*pathInfo}",new StopRoutingHandler()));
10.IgnoreRoute
11.路由测试 Route Debugger
install-package RouteDebugger
12.自定义约束 IRouteConstraint
routes.MapRoute("name", "{controller}", new { controller = "Traditonnal", action = "Index" }, new {HttpMethod = new HttpMethodConstraint("GET")});
13.webForms和路由机制



// 第10章 NuGet
1.下载安装NuGet package 的步骤
1.首先找到(网络,本地)安装包
2.下载正确的zip包
3."解除阻止"包
4.确认下载文件的哈希值与宿主环境提供的哈希值相符
5.把包解压缩到合适的位置
6.添加程序集引用
7.更新web.config
2.NuGet.Packager  项目的结构,自己建一个NuGet.Packager 项目查看
$rootnamespace$
3.Packager Manager Console 用法,参数
1.get-help NuGet
2.使用选项卡,按 tab 智能提示
3.复合命令 用 | 隔开  如:Get-Project -all | Install-Package log4net
4.-version 标识特定版本
5.-reinstall 重新安装已安装的包
6.-IgnoreDependencies 忽略依赖
7.Uninstall-Package packageName -force 强制卸载
4.NuGet 命令(http://nuget.codeplex.com)
1.nuget ?  //查看帮助
2.nuget update -self (或 nuget u -self) //自动更新
3.nuget pack [Package.nuspec] -symbols //创建包
4.nuget pack [../NuGetSimple/NuGetSimple.csproj] -build  //打包项目
 nuget spec [../NuGetSimple/NuGetSimple.csproj]  //利用元数据
5.Get-Package
5.配置文件和源代码转换
1.使用配置文件转换 web.config.transform (app.config.transform)
2.使用xml文档转换(XDT xml document transform)  后缀 .install.xdt
6.nuspec 描述文件
1.命令:nuget spec -AssemblyPath [../NuGetSimple\bin\Debug\NuGetSimple.dll]  //根据dll生成
2.依赖库 <dependencies> version = 1.0 或 [1.0,2.0] 或 (1.0,) 或(,1.0).....  (1.0) 无效的版本表述
3.指定包含文件 files 节点
7.工具(PowerShell 脚本)
1.init.ps1 //解决方案第一次触发
2.install.ps1 //安装包触发
3.uninstall.ps1 //卸载触发
8.框架轮廓定位 lib\{framework Name}{version} (net/sl)
portable-net45-sl5+wp8+win8
9.预发布包[assembly:AssemblyInformationalVersion("1.0.1-alpha")]
10.发布到nuget.org http://nuget.org
nuget setApiKey [key] //目录 %appdata%\nuget\nuget.config
nuget push [.....nupkg]
11.包浏览器 http://npe.codeplex.com
12.安装本地nuget Install-Package [NuGetSimple] -Source [H:\temp\demo\SolutionDemo\NuGet.Packager1\]
13.搭建nuget服务器  新建web 执行 Install-Package NuGet.Server  ,注意是 保持Package source:官方源,即 Nuget offical package source


// WebApi
// 第11章 ASP.NET Web API
1.ApiController 命名空间:System.Web.Http
2.HttpRequestMessage,ResponseMessageResult 位于 :System.Net.Http 内
3.Task System.Threading.Tasks 表示一个异步操作。
4.自托管webapi配置
a.配置wcf自托管
Install-Package Microsoft.AspNet.WebApi.SelfHost
b.配置OWIN(Open Web Interface for .NET)自托管(http://owin.org)
Install-Package Microsoft.AspNet.WebApi.OwinSelfHost
// 项目 ConsoleWebApi演示
5.添加路由 [Http...] [HttpGet] Post,Put,Delete,Head,Patch,Options ... [AcceptVerb]
6.绑定参数 ModelBinderAttribute ,FromUriAttribute , FromBodyAttribute (位于:System.Web.Http)
7.过滤请求 IAuthenticationFilter(身份验证过滤器),IAuthorizationFilter/AuthorizationAttribute(授权过滤器)
IActionFilter/ActionFilterAttribute(操作过滤器),IExceptionFilter/ExceptionFilterAttribute(异常过滤器)
8.启用依赖注入
9.HelpPage nuget包
1.Install-Package Microsoft.AspNet.WebApi.HelpPage
2.HelpPageConfig  取消注释 //config.SetDocumentationProvider(new XmlDocumentationProvider(HttpContext.Current.Server.MapPath("~/App_Data/XmlDocument.xml")));
3.右键项目名称,选择属性,选择生成,在输出配置项,勾选XML文档文件,修改输出路径为App_Data/XmlDocument.xml
4.


// 第12章 应用Angular JS构建单页面应用程序
// 参见工程 AngularAtTheMovies
1.  Install-Package angularjs.Core
2.  Install-Package EntityFramework 
// API工程不带EF
//3. Install-Package AngularJS.Route
Install-Package -IncludePrerelease AngularJS.Route //重新安装AngularJS.Route


// 启用数据库迁移
 Enable-Migrations -ContextTypeName AtTheMovies.Models.MovieDb
 Update-Database


// 下面两个package也要安装
Install-Package AngularJS.Animate
Install-Package AngularJS.Resource


3.Angular 指令
1.ng-app  // 可以执行 js, js用{{}} 包起来
2.data-ng-app  // 同上
3.ng-app="modelName" // 装载模块名称
4.ng-controller // 
5.$scope // 类似于 MVC Mode
6.$http // 开箱即用服务
7.ng-repeate="movie in movies" // foreach

8.Install-Package AngularJS.Route


9.<ng-view></ng-view> // 占位符
10.$routeParams // 路由参数
11.
// 发现 delete put 405 (Method Not Allowed),原因IIS 版本问题 配置IIS 处理映射程序,也可以配置配置文件
<system.webServer>
  <modules>
    <remove name="WebDAVModule" />
  </modules>
  <handlers>
    <remove name="WebDAV" />
  </handlers>
</system.webServer>


// 第13章 依赖注入
1.控制反转(IoC):把依赖的创建移到使用这些依赖的外部
1.服务定位器
a)强类型服务定位器,见 ConsoleWebApi 工程 NotificationSystem类
b)弱类型服务定位器,见 ConsoleWebApi 工程 NotificationSystem2类
2.依赖注入:(Dependency Injection)
a)构造函数注入
b)属性注入
c)依赖注入器
2.MVC中:
a)单一注册服务
IControllerActivator,IControllerFactory,IViewPageActivator,ModelMetadataProvider
b)复合注册服务
IFilterProvider,IModelBinderProvider,IVIewEngine,ModelValidatorProvider,ValueProviderFactory
c)任意对象
IControllerActivator,IViewPageActivator
3.WebAPI中
a)单一注册服务
IActionValueBinder,IApiExporer,IAssembliesResolver,IBodyModelVaildator,IContentNegotiator,IDocumentationProvider,
IHostBufferPolicySelector,IHttpActionInvoker,IHttpActionSelector,IHttpControllerActivator,IHttpControllerSelector,
IHttpControllerTypeResolver,ITranceManager,ITraceWriter,ModelMetadataProvider
b)复合注册服务
IFilterProvider,ModelBinderProvider,ModelValidatorProvider,ValueProviderFactory
c)任意对象
ModelBinder,HttpControllerConfiguration


// 第14章 单元测试
1.单元测试和测试驱动开发(Test-Driven Development) TDD(先编写测试用例)
2.单元测试的定义
1.测试小部分代码(粒度小)
2.隔离测试(只测试一个功能)
3.只测试公共端点(细粒度,其他修改,本单元测试不修改)
4.自动结果
5.单元测试--软件质量的保证
3.测试驱动开发的定义
1.红绿周期(red/green cycle)
2.重构
3.3A
Arrange:准备测试环境
Act:在测试中调用的方法
Assert:确保按预期执行
4.单一断言规则
4.单元测试在MVC和MVCAPI中的技巧和窍门[Moq]
1.控制器测试
控制器中不要包含业务逻辑,通过构造函数传递服务依赖,对HttpContext操纵采用操作结果,对UpdateModel使用操作参数,利用操作过滤器实现正交
2.路由测试
测试IgnoreRoute函数调用,测试MapRoute函数调用,不匹配路由的测试
3.验证测试(QUnit JQuery 单元测试)
DataAnnotation,IClientValidatable,CompareAttribute.RemoteAttribute,JqueryValidate


// 对应工程 ExtendingMvc
// 第15章 扩展ASP.NET MVC
-1. appSettings 中配置 webpages:Enabled = true; 来干预 IHttpHandler
-2. MVC 可以默认先渲染 Index.cshtml
1.模型扩展
1)把请数据转换为模型
1.使用值提供器解析请求数据
(子操作renderAction的显示值,表单值,来自XMLHttpRequest的JSON数据,路由值,查询字符串值,上传文件)
(自己编写值提供器注册到 ValueProviderFactories.Factories 中)
(MVC也包含 Cookie值提供器,服务器变量值提供器,Session值提供器,TempData值提供器)
2.IModelBinder demo:ModelBinder
2)用元数据描述模型(基于:DataAnnotationsModelMetadataProvider)
System.ComponentModel,System.ComponentModel.DataAnnotations  demo:FluentMetadata
3)验证模型(基于:ModelValidatorProvider) demo:FluentValidation
2.视图扩展
WebForm视图引擎,Razor视图引擎,第三方(Spark,NHaml,NVelocity)
1)自定义视图引擎
({0}=视图名称)({1}=控制器名称)({2}=区域名称)
2)Html辅助方法
3)Razor辅助方法(只能访问 HttpContext.Current,不能访问 ControllerContext或ViewContext)
3.控制器扩展
1)操作选择
1.用名称选择器选择操作名称(ActionName)特性 (:ActionNameSelectorAttribute)示例代码:ActionNameSelector
2.使用方法过滤器(HttpGet....等)(AcceptVerbs和NonAction 是不能请求有效的) (:ActionMethodSelectorAttribute) 示例代码 ActionMethodSelector/Utility/AjaxOnlyAttribute.cs
2)操作过滤器
1.身份验证过滤器(WWW-Authenticcate:Basic头部)(IAuthenticationFilter) demo:BasicAuthenticationFilter
2.授权过滤器(IAuthorizationFilter)
3.操作结果过滤器 IActionFilter demo:TimingFilter
4.异常过滤器(IExceptionFilter -- MVC只有一个 HandlerErrorAttribute)
5.过滤器重写(IOverrideFilter,新特性,此过滤器权重高,在其他过滤器之前执行,引起干扰,没有实际测试)
3)提供自定义结果 XMLResult demo:CustomActionResult


// 第16章 高级主题
// ExtendingMvc
1.移动支持
a.适应性呈现(基于bootstrap ,css media queries实现)
<meta name="viewport" content="width=device-width,initial-scale=1.0">
@media特性 max-width:768px;
bootstrap3 网格系统 demo:http://getbootstrap.com/css/#grid
b.显示默认(.Mobile.cshtml 模板)
global.asax 中配置
DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("winPhone")
            {
                ContextCondition = (contex => contex.GetOverriddenUserAgent().IndexOf("Windows Phone OS", StringComparison.OrdinalIgnoreCase) >= 0)
            });
2.高级Razor // demo Area/CustomWebViewPage
views 视图下面 web.config 改  <pages pageBaseType="CustomWebViewPage">
1.模板化的razor委托
2.视图编译
3.高级视图引擎
1.配置,参见global.asax 中配置
ViewEngines.Engines.Clear();
     ViewEngines.Engines.Add(new MyViewEngine());
2.查找视图 IViewEngine
3.视图本身 IView
4.备用视图引擎
1.Spark https://github.com/SparkViewEngine
2.NHaml https://github.com/NHaml/NHaml
3.Brail http://mvccontrib.org http://mvccontrib.codeplex.com/
4.StringTemplate https://code.google.com/p/string-template-view-engine-mvc/
5.Nustache https://github.com/jdiamond/Nustache
6.Parrot http://thisisparrot.com/ (CSS的语法)
7.JavaScript View Engine(JSVE)https://github.com/Buildstarted/Javascript.ViewEngines
5.新视图引擎还是新ActionResult(全局还是局部)
4.高级基架
1.asp.net基架简介
a)基架模板自定义
b)自定义基架器 (Add New Scaffold)
2.自定义基架模板
默认基架:Text Template Transformation Toolkit(T4) http://msdn.microsoft.com/en-us/library/bb126445.aspx
默认基架位置:C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Extensions\Microsoft\Web\Mvc\Scaffolding\Templates
Scaffold:Visual Studio 扩展
3.自定义基架器 http://blogs.msdn.com/b/webdev/archive/2014/04/03/creating-a-custom-scaffolder-for-visual-studio.aspx
5.高级路由
1.RouteMagic
Install-Package RouteMagic.Mvc
//路由转接
http://github.com/Haacked/RouteMagic
var newRoute = routes.MapRoute("new", "bar/{controller}/{id}/{action}");
        routes.Redirect(r => r.MapRoute("oldRoute", "foo/{controller}/{action}/{id}")).To(newRoute);
2.可编辑路由
1.RouteConfig F4 属性,内容包含
2. RouteTable.Routes.RegisterRoutes("~/App_Start/Routes.cs");
6.高级模板
1.默认模板 DefaultEditorTemplates.cs
模板定义,模板选择(字段类型,枚举?数字?字符串)
2.自定义模板
约定位置:DisplayTemplates 或 EditorTemplates 或 ViewShare
比较有用的模板:Html5EditorTemplates
7.高级控制器
1.IController
2.ControllerBase
3.控制器类和操作  DRY(Don't Repeat Yourself)
4.ActionResult
a)操作结果辅助方法  Redirect,RedirectPermanent....
b)操作结果类型 ContentResult ... FileResult...HttpNoFound...EmptyResult
c)隐式操作结果  也即控制器的方法返回值可以是 string int 等,用 Content包一下
5.操作调用器
1.一个操作如何映射到一个方法
操作方法选择(NonActionAttribute,ActionNameAttribute,ActionSelectorAttribute,AcceptVerbsAttribute,模拟RESTful动词)
2.调用操作
8.使用异步控制器操作
Task<ActionResult>
async await
IO (异步) CPU(同步)
1)编写异步的步骤
Public async Task<ActionResult> News(){
var news = await (new NewsServices()).GetAllNews();
return View(news);
}
2)异步多个并行操作
await Task.WhenAll(returnResult1,returnResult2,returnResult3);


// 第17章 ASP.NET MVC实战:构建NugGet.org
1.源码下载地址
// https://github.com/NuGet/NuGetGallery
// https://github.com/NuGet/NuGetGallery/archive/master.zip
源码运行样子:http://nuget.org 
2.WebActivator
3.ASP.NET动态数据
insert into UserRoles(UserKey,RoleKey) values(1,1)
4.异常日志
ELAMH(Error Logging Module and Handler)
5.性能分析
Glimpse(http://getglimpse.com)
6.数据访问 Code Fist
7.EF基于代码迁移
Add-Migration AddAgeToUser
update-database
8.使用Octopus Deploy 部署
9.使用Fluent Automation自动进行浏览器测试
10.其他有用的Nuget包
1.Install-Package WebBackgrounder
2.Install-Package Lucene.Net
3.Install-Package AnglicanGeek.MarkdownMailer
4.Install-Package Ninject




附录A ASP.NET MVC5.1
A.1 ASP.NET MVC5.1版本说明
MVC5.1
改进路由特性
针对编辑器模板的Bootstrap的支持
视图中的枚举支持
MinLength/MaxLength特性的非侵入式验证
在非侵入式Ajax中支持this上下文
各种bug修正
Web API2.1
全局错误处理
特性路由的改进
帮助页面的改进
IgnoreRoute支持
BSON媒体类型格式化
更好地支持异步过滤器
客户端格式化库的查询解析
各种bug修正
A.2 ASP.NET MVC视图中的枚举支持
A.3 使用自定义约束的特性路由
实现 IRouteConstraint
[Route("temp/{scale:values(celsius|fahrenheit)}")]
A.4 Bootstrapt和Javascript增强
0 0