// 2015-07-23
// 第一章 入门
// 第二章 控制器
// 第三章 视图
-Package Wrox.
-Package Wrox.
// UnInstall-Package Wrox.
Install-Package SomePackage -Source C:\PathToThePackageDir\
// 第四章 模型
1.基架 scaffolding
2.建立属性的时候巧用 prop Tab两次
domain-driver design 领域驱动模型 , CQRS command-query responsibility segregation 命令查询职责分离; 这两个使用的流程设计模式:库和工作单元设计模式
4.基架代码, EF数据库初始化(1.用实体框架创建数据库2.使用数据库初始化器3.播种数据库)
显示绑定(Bind,UpdateModel,TryUpdateModel)
// 第五章 表单和HTML辅助方法
标签的默认 action 当前页面,method get
默认是 form方式
参数中 class关键字用 @class代替 , data-val 用 data_val代替
渲染的 id . 编程 _
,,,,...,Endit Raw....,,...For结尾的强类型
(Action,Content,RouteUrl)
(写入相应流的,效率高点),下面演示一样的效果
@{("partialName")}
@("partialName")
效果同7 涉及attribute(ChildOnlyAttribute)
// 第六章 数据注解和验证
1.在项目的"程序包管理控制台"窗口,输入"enable-migrations",回车,导致在项目中生成一个“Migrations"文件夹,其中包含两个.cs类。
2.在1中生成的中修改构造函数中代码为:”AutomaticMigrationsEnabled = true;
3.保存修改后,在"程序包管理控制台"中输入"update-database",回车,再次运行即可。
: Remote,ScanffodColum,DisplayFormat,ReadOnly,DataType,Uhint
Order 默认为 10000
// 第七章 成员资格、授权和安全性
编码,raw
2.全局过滤器: (new AuthorizeAttribute());
,AllowAnonymousAttribute,RequireHttpsAttribute
和 OpenId
5.跨站脚本(XSS) Passive Injection(被动注入),Active Injection(主动注入)
脚本,html,属性值编码:,,Javascript编码
引入: (AntiXSS库)
<httpRuntime encoderType=",,Version=4.0.0.0,Culture=netural,PublicKeyToken=b03f5f7f11d50a3a" />
<httpRuntime encoderType="" />
6.跨站请求伪造(CSRF 或 XSRF) Cross-Site Request Forgery
混淆代理,幂等的GET请求,cookie盗窃(会话cookie,持久性cookie)HttpOnly组织盗窃cookie
重复提交,开放重定向, RedirectToLocal(url);
7.配置转换,看
8.配置文件customErrors (Retail 配置, <><deployment retail="true /></>
retail :n. 零售; vt. 零售; 零卖; 转述; 传播; adj. 零售的;
// 第8章 Ajax
CSS(Casdading Style Sheet) JSON(JavaScrpt Object Notation)
JQuery Unobrusive Ajax 插件(Ajax辅助方法)
install-package
特性 data-,Jquery客户端验证,自定义脚本,
UI
install-package
Jquery 自动完成
客户端模板
install-package
(Content Delivery Network) 内容分发网络
7.
// 第9章 路由
(Uniform Resource Locator) 统一资源定位符
(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
区域,特性区域,区域的注册顺序
-all 参数 ("callallroute", "query/{query-name}/{*extrastuff}");
() (new Route("{resource}.axd/{*pathInfo}",new StopRoutingHandler()));
11.路由测试 Route Debugger
install-package RouteDebugger
12.自定义约束 IRouteConstraint
("name", "{controller}", new { controller = "Traditonnal", action = "Index" }, new {HttpMethod = new HttpMethodConstraint("GET")});
和路由机制
// 第10章 NuGet
1.下载安装NuGet package 的步骤
1.首先找到(网络,本地)安装包
2.下载正确的zip包
3."解除阻止"包
4.确认下载文件的哈希值与宿主环境提供的哈希值相符
5.把包解压缩到合适的位置
6.添加程序集引用
7.更新
项目的结构,自己建一个 项目查看
$rootnamespace$
Manager Console 用法,参数
-help NuGet
2.使用选项卡,按 tab 智能提示
3.复合命令 用 | 隔开 如:Get-Project -all | Install-Package log4net
4.-version 标识特定版本
5.-reinstall 重新安装已安装的包
6.-IgnoreDependencies 忽略依赖
-Package packageName -force 强制卸载
命令()
? //查看帮助
update -self (或 nuget u -self) //自动更新
pack [] -symbols //创建包
pack [../NuGetSimple/] -build //打包项目
nuget spec [../NuGetSimple/] //利用元数据
-Package
5.配置文件和源代码转换
1.使用配置文件转换 ()
2.使用xml文档转换(XDT xml document transform) 后缀 .
描述文件
1.命令:nuget spec -AssemblyPath [../NuGetSimple\bin\Debug\] //根据dll生成
2.依赖库 <dependencies> version = 1.0 或 [1.0,2.0] 或 (1.0,) 或(,1.0)..... (1.0) 无效的版本表述
3.指定包含文件 files 节点
7.工具(PowerShell 脚本)
.ps1 //解决方案第一次触发
.ps1 //安装包触发
.ps1 //卸载触发
8.框架轮廓定位 lib\{framework Name}{version} (net/sl)
portable-net45-sl5+wp8+win8
9.预发布包[assembly:AssemblyInformationalVersion("1.0.1-alpha")]
10.发布到
nuget setApiKey [key] //目录 %appdata%\nuget\
nuget push [.....nupkg]
11.包浏览器
12.安装本地nuget Install-Package [NuGetSimple] -Source [H:\temp\demo\SolutionDemo\NuGet.Packager1\]
13.搭建nuget服务器 新建web 执行 Install-Package ,注意是 保持Package source:官方源,即 Nuget offical package source
// WebApi
// 第11章 Web API
命名空间:
,ResponseMessageResult 位于 : 内
表示一个异步操作。
4.自托管webapi配置
a.配置wcf自托管
Install-Package
b.配置OWIN(Open Web Interface for .NET)自托管()
Install-Package
// 项目 ConsoleWebApi演示
5.添加路由 [Http...] [HttpGet] Post,Put,Delete,Head,Patch,Options ... [AcceptVerb]
6.绑定参数 ModelBinderAttribute ,FromUriAttribute , FromBodyAttribute (位于:)
7.过滤请求 IAuthenticationFilter(身份验证过滤器),IAuthorizationFilter/AuthorizationAttribute(授权过滤器)
IActionFilter/ActionFilterAttribute(操作过滤器),IExceptionFilter/ExceptionFilterAttribute(异常过滤器)
8.启用依赖注入
nuget包
-Package
取消注释 //(new XmlDocumentationProvider(("~/App_Data/")));
3.右键项目名称,选择属性,选择生成,在输出配置项,勾选XML文档文件,修改输出路径为App_Data/
4.
// 第12章 应用Angular JS构建单页面应用程序
// 参见工程 AngularAtTheMovies
1. Install-Package
2. Install-Package EntityFramework
// API工程不带EF
//3. Install-Package
Install-Package -IncludePrerelease //重新安装
// 启用数据库迁移
Enable-Migrations -ContextTypeName
Update-Database
// 下面两个package也要安装
Install-Package
Install-Package
指令
-app // 可以执行 js, js用{{}} 包起来
-ng-app // 同上
-app="modelName" // 装载模块名称
-controller //
5.$scope // 类似于 MVC Mode
6.$http // 开箱即用服务
-repeate="movie in movies" // foreach
-Package
9.<ng-view></ng-view> // 占位符
10.$routeParams // 路由参数
11.
// 发现 delete put 405 (Method Not Allowed),原因IIS 版本问题 配置IIS 处理映射程序,也可以配置配置文件
<>
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
</>
// 第13章 依赖注入
1.控制反转(IoC):把依赖的创建移到使用这些依赖的外部
1.服务定位器
a)强类型服务定位器,见 ConsoleWebApi 工程 NotificationSystem类
b)弱类型服务定位器,见 ConsoleWebApi 工程 NotificationSystem2类
2.依赖注入:(Dependency Injection)
a)构造函数注入
b)属性注入
c)依赖注入器
中:
a)单一注册服务
IControllerActivator,IControllerFactory,IViewPageActivator,ModelMetadataProvider
b)复合注册服务
IFilterProvider,IModelBinderProvider,IVIewEngine,ModelValidatorProvider,ValueProviderFactory
c)任意对象
IControllerActivator,IViewPageActivator
中
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,,JqueryValidate
// 对应工程 ExtendingMvc
// 第15章 扩展 MVC
-1. appSettings 中配置 webpages:Enabled = true; 来干预 IHttpHandler
-2. MVC 可以默认先渲染
1.模型扩展
1)把请数据转换为模型
1.使用值提供器解析请求数据
(子操作renderAction的显示值,表单值,来自XMLHttpRequest的JSON数据,路由值,查询字符串值,上传文件)
(自己编写值提供器注册到 中)
(MVC也包含 Cookie值提供器,服务器变量值提供器,Session值提供器,TempData值提供器)
demo:ModelBinder
2)用元数据描述模型(基于:DataAnnotationsModelMetadataProvider)
, demo:FluentMetadata
3)验证模型(基于:ModelValidatorProvider) demo:FluentValidation
2.视图扩展
WebForm视图引擎,Razor视图引擎,第三方(Spark,NHaml,NVelocity)
1)自定义视图引擎
({0}=视图名称)({1}=控制器名称)({2}=区域名称)
2)Html辅助方法
3)Razor辅助方法(只能访问 ,不能访问 ControllerContext或ViewContext)
3.控制器扩展
1)操作选择
1.用名称选择器选择操作名称(ActionName)特性 (:ActionNameSelectorAttribute)示例代码:ActionNameSelector
2.使用方法过滤器(HttpGet....等)(AcceptVerbs和NonAction 是不能请求有效的) (:ActionMethodSelectorAttribute) 示例代码 ActionMethodSelector/Utility/
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:/css/#grid
b.显示默认(. 模板)
中配置
(0, new DefaultDisplayMode("winPhone")
{
ContextCondition = (contex => ().IndexOf("Windows Phone OS", ) >= 0)
});
2.高级Razor // demo Area/CustomWebViewPage
views 视图下面 改 <pages pageBaseType="CustomWebViewPage">
1.模板化的razor委托
2.视图编译
3.高级视图引擎
1.配置,参见 中配置
();
(new MyViewEngine());
2.查找视图 IViewEngine
3.视图本身 IView
4.备用视图引擎
/SparkViewEngine
/NHaml/NHaml
/
/p/string-template-view-engine-mvc/
/jdiamond/Nustache
/ (CSS的语法)
View Engine(JSVE) /Buildstarted/
5.新视图引擎还是新ActionResult(全局还是局部)
4.高级基架
基架简介
a)基架模板自定义
b)自定义基架器 (Add New Scaffold)
2.自定义基架模板
默认基架:Text Template Transformation Toolkit(T4) /en-us/library/
默认基架位置:C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Extensions\Microsoft\Web\Mvc\Scaffolding\Templates
Scaffold:Visual Studio 扩展
3.自定义基架器 /b/webdev/archive/2014/04/03/
5.高级路由
Install-Package
//路由转接
/Haacked/RouteMagic
var newRoute = ("new", "bar/{controller}/{id}/{action}");
(r => ("oldRoute", "foo/{controller}/{action}/{id}")).To(newRoute);
2.可编辑路由
F4 属性,内容包含
2. ("~/App_Start/");
6.高级模板
1.默认模板
模板定义,模板选择(字段类型,枚举?数字?字符串)
2.自定义模板
约定位置:DisplayTemplates 或 EditorTemplates 或 ViewShare
比较有用的模板:Html5EditorTemplates
7.高级控制器
3.控制器类和操作 DRY(Don't Repeat Yourself)
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 (returnResult1,returnResult2,returnResult3);
// 第17章 MVC实战:构建
1.源码下载地址
// /NuGet/NuGetGallery
// /NuGet/NuGetGallery/archive/
源码运行样子:
动态数据
insert into UserRoles(UserKey,RoleKey) values(1,1)
4.异常日志
ELAMH(Error Logging Module and Handler)
5.性能分析
Glimpse()
6.数据访问 Code Fist
基于代码迁移
Add-Migration AddAgeToUser
update-database
8.使用Octopus Deploy 部署
9.使用Fluent Automation自动进行浏览器测试
10.其他有用的Nuget包
-Package WebBackgrounder
-Package
-Package
-Package Ninject
附录A MVC5.1
A.1 MVC5.1版本说明
MVC5.1
改进路由特性
针对编辑器模板的Bootstrap的支持
视图中的枚举支持
MinLength/MaxLength特性的非侵入式验证
在非侵入式Ajax中支持this上下文
各种bug修正
Web API2.1
全局错误处理
特性路由的改进
帮助页面的改进
IgnoreRoute支持
BSON媒体类型格式化
更好地支持异步过滤器
客户端格式化库的查询解析
各种bug修正
A.2 MVC视图中的枚举支持
A.3 使用自定义约束的特性路由
实现 IRouteConstraint
[Route("temp/{scale:values(celsius|fahrenheit)}")]
A.4 Bootstrapt和Javascript增强