【Pro ASP.NET MVC 3 Framework】.学习笔记.1.主要语言特性
C# 是一个富有特性的语言,并不是所有的程序员都熟悉本书依赖的所有特性。在本章,我们看看作为一个好的MVC程序员需要知道的C#特性。
1 C#主要特性
1.1 使用扩展方法
扩展方法 在你不能拥有,和不能直接修改类时,给类添加方法一个方便的方式。
假设我们需要决定ShoppingCart类中Product对象的所有值,但是我们不能修改类本身,也许是因为它来自于第三方,我们没有源代码。幸运地,我们可以使用扩展方法,来得到我们想要的功能。
第一个参数前的 this 关键字,使得 TotalPrices 成为一个扩展方法。第一个参数告诉 .net 要为哪个类扩展方法。我们的方法枚举Products,并返回 Product.Price属性的合计。
扩展方法不能使你突破类为它的方法、fields 和属性定义的访问规则。你可以通过扩展方法扩展类的功能,但是只能访问你已经可以访问的类成员。
1.1.1 将扩展方法应用到一个接口
我们也可以创建扩展方法,将它应用到一个接口。它允许我们在任何安装启用接口的类上调用扩展方法。
第一个参数的类型已经变为 IEnumerabel<Product>,这意味着方法体中的foreach 循环会直接作用在参数对象上。另外,扩展方法没有变化。切换到接口,意味着我们能计算IEnumerable<Product>枚举的Products的合计值。
1.1.2 创建一个过滤扩展方法
扩展方法可以用来过滤对象的集合。一个操作IEnumerable<T>的扩展方法,会返回一个IEnumerable<T>,可以使用 yield 关键字 来对数据源中的 items 应用选择标准,产生一个缩小的结果集。
这个叫做 FilterByCategory的扩展方法,有一个附加的参数,允许我们在调用方法时,注入过滤项。那些 Category 属性 与 参数匹配的 Product 对象,会在结果 IEnumerable<Product>中返回,不匹配的会被丢弃。
1.2 使用Lambda表达式
我们可以使用委托,使得 FilterByCategory 方法更普遍。委托可以以我们选择的任何方式,被每个Product调用,以过滤对象。
我们使用 Func 作为过滤参数,这意味着我们不用将委托定义为类型。Func 取走一个 Product 参数,并返回 bool。如果 Product包含在结果中,就返回 true。这个参数的另一端有点长。
我们现在可以在委托中使用指定的标准,过滤 Product 对象。但是我们首先需要为每个标准定义 Func ,这样做不够理想。减少啰嗦的供选择的方式,是使用Lambda表达式,这是一种委托中方法体的简明表达方式。
参数不用指定类型的方式被表达出来,它的类型会自动被推论。=> 读作 goes to ,将参数链接到 Lambda 表达式的结果。prod 将 Product 参数 goes to 到一个bool 结果,当 prod 的 Category 参数等于 true 时,返回 true。
我们可以完全地取消 Func ,使得我们的语法更紧凑。
我们将 Lambda 表达式作为参数提供给 Filter 方法,这是不错且原始的方法,来表达我们想要应用的过滤。
1.2.1 Lambda 的其他格式
我们不需要在Lambda表达式中表达委托的逻辑。我们可以简单地调用方法。如果我们需要一个 委托中有多个参数 的Lambda表达式,我们需要用括号将其包裹起来
如果表达式过于复杂,我们可以使用大括号
1.3 使用匿名类型
var 关键字允许我们创建一个本地变量,而不用明确指定它的类型。结合对象初始化器和类型接口,我们能创建一个简单的 data-storage 对象,而不需要定义相应的类和结构。
mAnonType 是一个匿名类型对象。它意味着编译器会自动地创建类型定义。强类型依然会实施。你你在它的属性被定义在初始化器后,只能 set 和 get 属性。
C#编译器会根据初始化器中的参数的名字和类型生成类。两个拥有相同属性名字和类型的匿名类型对象,会被指派给相同的自动生成类。这意味着我们能用匿名类型对象创建一个数组。
1.4 Linq
想象偶们有一个 Product 对象集合,我们想要找到价格最高的前三个,并打印他们的名字和价格。一般我们会这样写:
使用 Linq 的话:
这看上去有一些整齐。使用 select 关键字,返回一个仅包含我们想要的属性的匿名类型。如果还要更强大的,可以使用 Linq 的 点符号。
OrderByDescending 方法将数据源中的 item 重新排列。在这个例子中,Lambda表达式返回我们想要用来比较的值。Take 方法返回结果集中,前几个指定数目的。Select 方法允许我们计划我们想要的结果。在这个例子中,我们计划一个匿名对象,包含名字和价格属性。下表中所有的Linq 方法都作用于 IEnumerable<T> 。
扩展方法 | 描述 | 延迟 |
All | 如果所有数据源中的items匹配判断,返回true | No |
Any | 如果数据源中的Items至少有一个匹配判断,返回True | No |
Contains | 如果数据源包含一个指定的item或 value,返回 true | No |
Count | 返回数据源中 items 的个数 | No |
First | 返回第一个 | No |
FirstOrDefault | 如果数据源中没有 items,则返回默认值。如果有,返回第一个 | No |
Last | 返回最后一个 | No |
LastOrDefault | 如果数据源中没有items,则返回默认值。如果有,则返回最后一个 | No |
Max Min | 返回Lambda表达式指定项的最大最小值 | No |
OrderBy OrderByDescending | 基于Lambda表达式返回的值,对数据源排序 | Yes |
Reverse | 逆转Items 的顺序 | Yes |
Select | 计划一个查询结果 | Yes |
SelectMany | 计划每个数据项到一个序列。链接所有的结果序列到一个单独序列 | Yes |
Single | 返回第一个item。如果有多个匹配,则抛出异常 | No |
SingleOrDefault | 返回第一个item。如果有多个匹配,则抛出异常。如果没有,则返回默认值。 | No |
Skip SkipWhile | 跳过指定数目的元素,或当条件匹配时跳过 | Yes |
Sum | 判定选中的所有values的合计 | No |
Take TakeWhile | 从数据源开始处选择指定数目的元素。或者选择条件匹配的元素 | Yes |
ToArray ToDictionary ToList | 将数据源转换为一个数组,或其他集合类型 | No |
Where | 从数据源中过滤项目,不匹配判断 | Yes |
1.4.1 延迟
仅包含延期方法的查询,直到 IEnumerable<T> 结果中的 items 可枚举时才会执行。
我们先定义了查询语句后,修改了Product 数组中的对象。当枚举查询结果时,发现修改生效了。我们看到,查询没有被评估,直到结果被枚举。所以我们做的改变,被反射到输出中。
1.4.2 使用延期前,需三思
我们会看到两次枚举的结果不一样。我们并不需要重新定义,更新,或任何其他方式修改Linq 查询。这意味着我们总是依赖延迟查询得到反射到最后更改过的数据源,也意味着查询的结果没有被缓存。如果你想要缓存查询的结果,你应该使用没有延迟的方法,如ToArray,它会立即执行。
1.4.3 Linq 和 IQueryable<t> 接口
Linq不仅能查询居住在内存中的C#对象,而且也能查询XML,非常方便地创建,处理,查询XML content。Parallel LINQ 可能回事下一代 Linq。
Linq 查询也能在从EF获得的数据上执行。EF是 ORM 框架,它允许我们使用 c# 对象处理关系数据,它的机制会在后面看到。
IQueryable<T> 接口由 IEnumerable<T> 派生而来。它用来标识查询执行的结果,针对一个特定的数据源。在我们的例子中,会是Sql Server db。这里没有必要直接使用IQueable<T>。Linq最好的特性之一,就是相同的查询可以被不同类型的数据源执行(objects,XML,db等)。
2 理解 Razor 语法
Razor是MVC3中新 view 引擎的名字。View 引擎处理 web 页面,寻找包含服务端介绍的指定的元素。
Razor 声明以@开头。一个强类型的view,传递一个 model 对象到view。我们能通过 @Model 属性引用方法,字段,属性。
在代码块中包含文本,以HTML 元素开头的,可以这样写
在代码块中包含文本,不以HTML元素开头的,应该这样写:
如果想要添加一些不以 HTML 元素开头的行,可以使用 TEXT 元素,这样做和使用 @: 效果一样。
2.1 在代码块中包含多个功能
if (Model.Category =="Watersports") {
}
) {
}
}
有两个 if 块,他们都相互独立的操作。这种类型的代码块,主要用来指定变量的值。
2.2 用 View Bag 特性传递数据
@ViewBag.ProcessingTime
ViewBag 是一个动态类型,意味着我们能用指定值的方式,定义他们的属性。使用ViewBag 和使用 ViewData 没有先进之分。
2.3 使用布局
当我们创建视图时,我们指定我们想要的布局,但是我们没有告诉 VS 使用哪一个。在新建View时,对话框告诉我们,如果在 Razor _viewstart文件中设置了此选项,则留空。在View 文件夹中,会看到 _ViewStart.cshtml 文件,该文件中写着 Layout=”~/Views/Shared/_Layout.cshtml”。
View文件以 下划线开头,当用户直接请求该文件时,它不能返回给用户。
当我们打开_Layout.cshtml文件,会看到以下代码:
@RenderBody()
</html>
这时我们会理解Index.cshtml的这段代码:
ViewBag.Title="Index";
}
它将该页的 title ,传递给了布局页。通过 @ViewBag.Title显示。Razor 使用 @RenderBody() 调用页面 body。
2.4 不使用 Layouts
Razor 布局只是一个选项,如果在创建 view 时没有选择layout选项,你会得到一个 html 模板。
如果不没有 layout,view 必须包含所有必须的 content 。同时必须明确地设定 Layout 为 null。如果没有设置,view 会使用 _ViewStart.cshtml中指定的 layout。
【Pro ASP.NET MVC 3 Framework】.学习笔记.1.主要语言特性的更多相关文章
- Pro ASP.NET MVC 5 Framework.学习笔记.6.3.MVC的必备工具
每个MVC程序员的军火库中,都有这三个工具:一个依赖注入(DI)容器,一个单元测试框架,一个模拟工具. 1.准备一个示例项目 创建一个ASP.NET MVC Web Application的Empty ...
- Pro ASP.NET MVC 5 Framework.学习笔记.6.4.MVC的必备工具
2.5.创建链式依赖 当你请求Ninject创建一个类型,它检查该类型的依赖是否声明.它也会检查该依赖是否依赖其他类型.如果这里有附加依赖,Ninject自动解决他们,并创建请求的所有类的实例.正是由 ...
- 【jqGrid for ASP.NET MVC Documentation】.学习笔记.3.本地化语言包
1 引用本地化语言包 在 js/i18n 文件夹中,提供了大量预定义的语言包.它包括为所有字符串定义的,包括消息,标题,分页信息,搜索/添加/删除 的对话框 文本等. 在jQuery库文件后,在jqG ...
- ASP.NET MVC Web API 学习笔记---第一个Web API程序
http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...
- 【Pro ASP.NET MVC 3 Framework】.学习笔记.11.ASP.NET MVC3的细节:概览MVC项目
书Adam The Definitive Guide to HTML5 Adam Applied ASP.NET 4 in Context and Pro ASP.NET 4 到此为止,我们已经学了为 ...
- 【Pro ASP.NET MVC 3 Framework】.学习笔记.12.ASP.NET MVC3的细节:URLs,Routing和Areas
Adam Applied ASP.NET 4 in Context 1 介绍Routing系统 在引入MVC之前,ASP.NET假定被请求的URLs和服务器硬盘上的文件之间有着直接关系.服务器的任务是 ...
- 【Pro ASP.NET MVC 3 Framework】.学习笔记.9.SportsStore:Securing the Administration Features
1 设置表单身份认证 因为ASP.NET MVC基于ASP.NET平台的核心,所以我们可以使用ASP.NET Form的身份认证,这是保持用户登录轨迹通用的方法.现在介绍最基本的配置. 在Web.co ...
- 【Pro ASP.NET MVC 3 Framework】.学习笔记.7.SportsStore:购物车
3 创建购物车 每个商品旁边都要显示Add to cart按钮.点击按钮后,会显示客户已经选中的商品的摘要,包括总金额.在购物车里,用户可以点击继续购物按钮返回product目录.也可以点击Check ...
- ASP.Net MVC开发基础学习笔记:一、走向MVC模式
一.ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/bl ...
- ASP.Net MVC开发基础学习笔记(1):走向MVC模式
一.ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/bl ...
随机推荐
- Bash中的shopt选项
Bash中的shopt选项 http://blog.chinaunix.net/uid-20587169-id-1919110.html shopt命令用于显示和设置shell中的行为选项,通过这些选 ...
- python待解决问题笔记
2006, 'MySQL server has gone away' 描述:mysql服务端断开idle过期连接,而客户没有检测重连所以报错. 解决: def is_connection_usable ...
- 虚拟化技术比较 PV HVM
很多人看到同样配置的VPS价格相差很大,甚是不理解,其实VPS使用的虚拟技术种类有很多,如OpenVZ.Xen.KVM.Xen和HVM与PV.在XEN中pv是半虚拟化,hvm是全虚拟化,pv只能用于L ...
- RAC数据库迁移ASM磁盘组到其它存储
环境介绍: 一共有两个磁盘组:crs和data:crs使用normal冗余:data使用外部冗余. 添加新的asm磁盘过程(略) 1.迁移前 SQL> select group_number, ...
- php:PHPExcel导出excel表格
一.动态生成的内容如何能当成文件来下载呢? 方法:1.将Content-Type设置成application/octet-stream就可以了,即[header('Content-Type: appl ...
- mysql:innodb monitor(show engine innodb status)探秘
在旧的版本里面是show innodb status命令,新版本后改动了一些:show engine innodb status; 我们最熟悉的,应当就是show innodb status命令,可以 ...
- 操作系统:进程管理和IO控制
一.进程管理 进程管理包括进程控制,进程调度,进程同步与通信,死锁控制四个内容. (一)进程控制 进程是操作系统中运行的基本单位,包括程序段,数据段和进程控制段.操作系统通过进程控制块(PCB)管理进 ...
- node.js学习(1)
新建便笺 3 node.js学习(1) 1)安装 http://nodejs.org/download/下载. 2)编写一个案例 var http=require("http"); ...
- Leetcode: Mini Parser
Given a nested list of integers represented as a string, implement a parser to deserialize it. Each ...
- SQL 过滤 having
select * from emp --having 对分组之后使用 --输出部门号 和 部门的平均工资 并且 平均工资 > 2000 select deptno, avg(sal) as &q ...