




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ASP.NETMVC实训教程机械工业出版社赵鲁涛李晔等编目录模型层概述与执行机制实体数据模型2.12.22.3LINQ语句与使用2.4模型的数据校验第二章模型第二章模型2.1模型层概述与执行机制模型(Model)层是MVC4框架的最底层部分,它的职能主要有两个:①提供数据库的支持,包括对数据库中的数据进行增加(insert)、删除(delete)、修改(update)和查找(select)等具体操作;②提供软件模型、应用的具体实现过程,也就是最底层的方法的具体内容,封装给上层接口进行调用。在MVC框架中,模型层的执行机制如图2.1所示。图2.1模型层在MVC框架中的执行机制第二章模型2.1模型层概述与执行机制ASP.NET的MVC4框架中,模型表示应用程序的数据对象,以及相应的业务领域逻辑,包括数据验证和业务规则等内容。因此,模型是ASP.NETMVC4框架的核心部分。由于模型层应该只和数据及业务逻辑有关,也就是说,其不应该负责处理所有与数据或业务处理无关的操作,如不应该控制网站的执行流程等,因此,模型层应该只专注于如何有效地提供数据访问机制、交互环境、数据格式验证、业务逻辑验证等服务。同时,由于模型的独立性非常高,因此,如果一个VisualStudio方案中有多个要开发的项目,应该将模型独立成一个项目,好让此模型项目能在不同的项目之间共享使用。第二章模型2.2实体数据模型MVC4中,实体数据类型是系统与数据库的交互接口,非常重要。不同于Java使用JDBC-ODBC的数据库连接方式,MVC4在数据库连接的基础之上,将数据库在系统中抽象成为一个具体的数据库实体对象,在实体对象中映射出数据库中的各个表、各个字段的具体内容,完全模拟数据库。也就是说,在编写的工程中,直接在系统中就可以查到各个数据表的组成、样式和取值等,不用再去数据库中进行查找。建立数据库实体的方法如例2.1所示。【例2.1】数据库实体的建立。本例是对数据库实体建立步骤的具体说明。通过本例,读者可以完全掌握实体数据库建立的方法与机制。首先,数据库名称为MyStudent,数据库具体结构见表2.1~表2.3。序号字段字段描述格式长度是否主码备注1Sno学号nVarchar5是
2Sname姓名nVarchar8
3Ssex性别nVarchar2
4Sage年龄Numeric
5Sdept所在系所nVarchar20
表2.1
Student(学生)表第二章模型2.2实体数据模型表2.3SC(选课)表序号字段字段描述格式长度是否主码备注1Cno课程号nVarchar5是
2Cname课程名称nVarchar20
3Cpno先行课号nVarchar5
外码4Ccredit学分Numeric
表2.2Couarse(课程)表序号字段字段描述格式长度是否主码备注1Sno学号nVarchar5
2Cno课程号nVarchar5
3Grade成绩Numeric
第二章模型2.2实体数据模型表2.4Student表初始值数据库的初始赋值见表2.4~表2.6。SnoSnameSsexSageSdept95001李名男20CS95002张明女19IS95003刘红女19MA95004陈列男19ISCnoCnameCpnoCcredit1数据库542数学
23信息系统144操作系统635数据结构746数据处理
27PASCAL语言64表2.5Course表初始值第二章模型2.2实体数据模型表2.6SC表初始值SnoCnoGrade9500119795001290950013809500228695002392具体数据实体的建立过程见1.4.2节Step01~Step05。建立好的数据库实体如图2.2所示。图2.2
MyStudent数据库实体图第二章模型2.2实体数据模型需要注意的是,在Step05中勾选“确定所生成对象名称的单复数形式”复选框后,系统会将每个表以一个集合的复数形式给出,而每一个个体元素则以一个单一个体(单数)形式给出。也就是说,在创建实体数据类型时,实体数据类型是有单复数之分的,数据库和表的类型使用复数,实例使用单数,因此需要注意有无s的区分。在数据实体中,右击实体表,在弹出的快捷菜单中选择“属性”,会在UI界面的右下方显示数据表的属性。通过属性,可以进行表名称、表对应集的修改,单击每一个表内容,如Student表的Sno属性,会在右下角显示Sno属性的相关属性。我们可以在这里进行表与属性的修改。【例2.2】对表字段进行操作。1)选择“Student”表,将表名称改为“PersonInSchool”,对应于数据库中的“Student”表。2)选择“Student”表中的“Sname”字段,修改其最大长度为6,名称为“StudentName”,对应于数据库中的“Sname”属性,默认值设为“省略”;设置“Sage”的名称为“StudentAge”,对应于数据库中的“Sage”属性,设置默认值为“18”。3)针对以上要求,在1.4.2节的例子中进行修改,完成以上内容,并保证系统的正确运行。以上内容均在右侧属性栏中进行修改即可。需要注意的是,当完成以上修改后,程序中之前应用的字段都要进行相应的对照修改,这样才能保证系统的正常运行。第二章模型2.3LINQ语句与使用在MVC4的数据部分,我们将不再使用普通的SQL语句作为数据库操作语言,而是使用语言集成查询(LanguageIntegratedQuery,LINQ)作为固定数据库的操作语言。LINQ是ASP.NET中的新特性,它分为LINQtoObject、LINQtoSQL、LINQtoXML、LINQtoDataSet,并且它提供了统一的语法来查询多种异构数据源,开发人员可使用任何.NET语言(比如C#或者VB.NET)来查询数据源中的数据,而不用处理各种异构数据源之间的差异。LINQ允许开发人员查询任何实现了IEnumerable<>接口的集合,如Array、List、XML、DOM或者SQLServer数据表。LINQ提供了翻译时的类型安全检查和动态类型组合等功能,这里重点讲解如何使用LINQtoSQL访问数据库。第二章模型2.3LINQ语句与使用LINQ与SQL相比,有不少的好处,特别是学过SQL的人员更容易上手。LINQ的优点主要表现在:1)无须复杂的学习过程即可上手。2)编写更少代码即可创建完整的应用。3)更快开发错误更少的应用。4)无须利用“奇怪”的编程技巧就可合并数据源。5)提高新开发者的开发效率。6)任何对象或数据源都可以定制实现LINQ适配器,为数据交互带来真正的便利。2.3.1使用LINQ的好处第二章模型2.3LINQ语句与使用1.DataContext类型介绍DataContext类型(数据上下文)是System.Data.Linq命名空间下的重要类型,用于把查询语句翻译成SQL语句,以及把数据从数据库返回给调用方和把实体的修改写入数据库。DataContext提供了以下一些实用的功能:1)以日志形式记录DataContext生成的SQL。2)执行SQL(包括查询和更新语句)。3)创建和删除数据库。DataContext是实体和数据库之间的桥梁,首先我们需要定义映射到数据表的实体。Step01:定义实体类。2.3.2LINQtoSQL的预备知识第二章模型2.3LINQ语句与使用以MyStudent数据库为例,上述Student类被映射成一个表,对应数据库中的Student表。然后,在类型中定义了4个属性,对应表中的4个字段。其中,Sname字段是主码,如果没有指定Column特性的Name属性,那么系统会把属性名作为数据表的字段名,也就是说,实体类的属性名就需要和数据表中的字段名一致。Step02:现在,创建一个ASP.NET页面,然后在页面上加入一个GridView控件数据绑定。Step03:使用DataContext类型把实体类和数据库中的数据进行关联。用户可以直接在DataContext构造方法中定义连接字符串,也可以使用IDbConnection。usingSystem.Data.SqlClient;IDbConnectionconn=newSqlConnection("server=xxx;database=Northwind;uid=xxx;pwd=xxx");DataContextctx=newDataContext(conn);Step04:然后,通过GetTable获取表示底层数据表的Table类型,显然,数据库中的Student表的实体是Student类型。随后的查询语句,即使用户不懂SQL应该也能看明白。从Student表中找出Sname以“李”开头的记录,并把Sname、Ssex、Sage及Sdept封装成新的匿名类型进行返回。2.3.2LINQtoSQL的预备知识第二章模型2.3LINQ语句与使用结果如图2.3所示。2.3.2LINQtoSQL的预备知识图2.3运行结果2.匿名类型在动态语言中,用户可能比较熟悉的概念是匿名类型(anonymoustype)。当需要创建临时类型,却并不想创建类时,可以使用匿名类型。下面的代码演示了如何在C#中创建匿名类型。varstudent=new{FirstName="Stephen",LastName="Walt"};注意:student变量并没有指定类型(JavaScript或VBScript与之非常类似)。尽管如此,student仍然具有它的类型,只是用户不知道它的名字而已,它是匿名的,理解这一点非常重要。仅仅一行代码,我们即创建了一个新的类,又初始化了它的属性,十分简洁。在使用LINQtoSQL时,匿名类型非常有用,因为用户会发现经常需要创建一些临时功能的新类型。例如,当执行一个查询时,也许希望返回一个类,用来代表一些数据库列的集合,此时将需要创建一个代表这些列的临时类。第二章模型2.3LINQ语句与使用2.3.2LINQtoSQL的预备知识3.Lambda表达式在上述这段代码中,添加了C#4.0的新语法:s=>(s.IndexOf("a")>-1),这就是一个Lambda表达式,现在只需要简单的一些字符就完成了原本需要单独创建一个方法的过程,而且语法相当简洁。通过上面的例子,我们现在对Lambda表达式已经有了一个基本的了解。一个Lambda表达式通常由如下部分组成。1)首先是一个参数或者参数列表,也就是输入变量。在上述示例中,由于需要为委托传递一个字符串类型的变量,因此左侧的是s变量。2)接着是=>符号,称为Lambda运算符,MSDN中将这个符号读作“goesto”。3)最后是Lambda语句(块),可以是单条语句也可以是多个语句的语句块。为了加深印象,读者可以这样来理解Lambda表达式:要处理的参数=>处理这些参数的语句(块)说明如下:①要处理的参数:可以有一个参数、多个参数,或者无参数。②处理这些参数的语句(块):这部分就是我们平时编写函数时的实现部分(函数体)。第二章模型2.3LINQ语句与使用2.3.3LINQtoSQL的查询使用LINQtoSQL进行查询,类似于创建一个反向的SQL查询。LINQtoSQL查询以一个from子句开始,它指定了数据的位置,然后,指定where子句过滤数据,最后,指定用来表示数据的select子句(决定要返回的对象和属性)。因此,下列查询:将被C#编译器翻译成下面的查询:varq=db.Customers.Where(c=>c.City=="London").Select(c=>c);第一个查询使用了查询语法,第二个查询使用了方法语法。这两种查询是相同的。注意:使用方法语法的查询在Where()和Select()方法中允许使用Lambda表达式。Where()方法中的Lambda表达式用来过滤数据,Select()方法指明要返回的对象合适属性。第二章模型2.3LINQ语句与使用2.3.3LINQtoSQL的查询1.简单查询【例2.3】筛选年龄为20的学生。2.条件查询【例2.4】使用SELECT和条件语句返回学生姓名和所在系所的序列,其中系所只能是CS。第二章模型2.3LINQ语句与使用2.3.3LINQtoSQL的查询【例2.5】使用嵌套查询返回所有选课人的学号、姓名、课程号、课程名称、先行课号、学分和成绩。【例2.6】使用Count/Sum/Min/Max/Avg操作符进行查询。1)查找最小年龄。varq=db.Studnets.Select(p=>p.Sage).Min();2)查找拥有最低学分的课程。varq=db.Course.Min(o=>o.Ccredit);第二章模型2.3LINQ语句与使用2.3.3LINQtoSQL的查询【例2.7】使用OrderBy按课程学分对课程进行排序。【例2.8】使用GroupBy进行查询。使用OrderBy、Max和GroupBy得到每个学生的最高成绩,并按Sno对其进行排序。第二章模型2.3LINQ语句与使用2.3.3LINQtoSQL的查询3.模糊查询使用LINQtoSQL进行模糊查询,可以有很多方法,如Length、Substring、Contain、StartsWith、IndexOf等。【例2.9】下面查询并返回以“李”开头的全部学生信息。MyStudentsContextdb=newMyStudentsDataContext();varq=db.Students.where(m=>m.Sname.StartsWith("李"))4.多表查询【例2.10】在select子句中使用外码来筛选成学生和成绩。像上程序2、3行所示,语句没有join和into,则被翻译成SelectMany;同时有join和in时,那么语句就被翻译为GroupJoin。在这里,in的概念是对其结果进行重新命名。第二章模型2.3LINQ语句与使用2.3.3LINQtoSQL的查询【例2.11】显式联接两个表并从这两个表投影出结果。【例2.12】显式联接三个表并分别从每个表投影出结果。第二章模型2.3LINQ语句与使用2.3.3LINQtoSQL的查询【例2.13】以Students作为主表,SCs作为要连接的表,当SCs表中内容为空时,用null值填充。join的结果重命名为ords,使用DefaultIfEmpty()函数对其再次查询。其最后的结果中有个Order,因为“fromoinords.DefaultIfEmpty()”是对ords组再一次遍历,所以,最后结果中的Order并不是一个集合。但是,如果没有“fromoinords.DefaultIfEmpty()”这条语句,而且最后的select语句写成“selectnew{e.Sname,Order=ords}”的话,那么Order就是一个集合。第二章模型2.3LINQ语句与使用2.3.4LINQtoSQL进行插入插入记录时需要先创建一条新记录(对象),包括数据表中不能为null的所有字段,然后将这个对象作为属性成员添加到原有的类中,最后增加到数据库中。使用LINQtoSQL添加或插入新记录也是这样的步骤。首先,需要使用InsertOnSubmit()方法将一个实体添加到一个已经存在的表中。然后,调用DataContext中的SubmitChanges()对数据库执行SQLINSERT语句。实例代码:第二章模型2.3LINQ语句与使用2.3.5LINQtoSQL进行更新使用LINQtoSQL进行更新时,可以通过修改实体属性并调用DataContext的SubmitChanges()方法来对LINQtoSQL实体和底层的数据库表进行更新。实例代码:总结一下,这段代码就是先得到产品ID=12的产品,然后修改产品的单价属性,最后调用SubmitChanges()方法向数据库提交修改。第二章模型2.3LINQ语句与使用2.3.6LINQtoSQL进行删除使用LINQtoSQL进行删除时,可以采用下面的代码。实例代码:该段代码一开始从Student数据表中获取m.Sno==int.Parse(TextBox8.Text)的记录,然后用DeleteOnSubmit()的方法将该条记录删除,最后调用SubmitChanges()方法向数据库提交修改。第二章模型2.4模型的数据校验对用户输入的验证以及强制业务规则/逻辑是大多数Web应用的核心需求。ASP.NETMVC4包含了许多新的特性,明显简化了对用户输入的验证以及在模型/视图模型中对验证逻辑的强行实施。这些特性是这样设计的,验证逻辑在服务器上执行,也可以选择在客户端通过JavaScript来执行。ASP.NETMVC4中的验证设施和特性这样设计,以便:1)开发人员可以轻松地利用内置于.NET框架中的DataAnnotation验证支持。DataAnnotation提供了一个非常简便的方式,可以使用最少的代码在对象和属性上用声明的方式添加验证规则。2)开发人员可以集成他们自己的验证引擎,或者利用现有的验证框架,如Castle验证器或EntLib验证库。ASP.NETMVC4的验证特性是设计用来在利用新的ASP.NETMVC4的验证设施(包括客户端验证、模型绑定验证等)的同时,简化任何类型的验证架构的插入的。这意味着在常见的应用场景中启用验证是极其容易的,同时对更高级的场景还能保持极高的灵活性。第二章模型2.4模型的数据校验下面在ASP.NETMVC4中全程演示一个简单的CRUD场景示例,利用新的内置DataAnnotation验证支持。具体来说,就是实现一个“Create”表单来允许用户输入个人数据。我们想要确保在输入数据保存到数据库之前是合法的,如果不合法,就显示合适的错误消息。我们想要使得这个验证同时在服务器端和客户端(通过JavaScript)发生。我们还想要确保我们的代码遵循DRY原则(Don'tRepeatYourself,即不重复自己),这意味着我们应该只在一处实施验证规则,然后使得我们的控制器、action方法和视图来“兑现”这个承诺。接下来将使用VisualStudio2012,并利用ASP.NETMVC4来实现上述的场景。用户也可以使用VisualStudio2010及ASP.NETMVC4来实现完全一样的场景。2.4.1非数据库类DataAnnotation启用验证第二章模型2.4模型的数据校验Step01:实现FriendsController(没有校验)。首先在一个新的ASP.NETMVC4项目中添加一个简单的“Person”类,像下面这样:2.4.1非数据库类DataAnnotation启用验证然后在项目中添加一个“FriendsController”控制器类,添加两个“Create”action方法。第一个action方法是在对/Friends/CreateURL的HTTP-GET请求进来时调用的,它会显示一个空白的表单,用来输入个人数据;第二个action方法是在对/Friends/CreateURL的HTTP-POST请求进来时调用的,它会将提交的表单输入映射到一个Person对象,确认没有绑定错误发生,如果是合法的,最终会将数据保存到数据库中(在下文我们会实现相关的数据库工作)。如果提交的表单输入是不合法的,那么该action方法会重新显示带有错误的表单。第二章模型2.4模型的数据校验2.4.1非数据库类DataAnnotation启用验证第二章模型2.4模型的数据校验在实现了控制器之后,可以在VisualStudio中的其中一个action方法中右击,在弹出的快捷菜单中选择“添加视图”命令,这会弹出“添加视图”对话框,选择自动生成传入对象为Person的“Create”视图,如图2.4所示。2.4.1非数据库类DataAnnotation启用验证图2.4构建视图第二章模型2.4模型的数据校验然后,VisualStudio会在我们项目的\Views\Friends\目录中生成一个含有框架代码的Create.aspx视图文件。注意右边这段代码,它利用了ASP.NETMVC4中新的强类型HTML辅助方法。2.4.1非数据库类DataAnnotation启用验证第二章模型2.4模型的数据校验此时,当我们运行该应用,并且访问/Friends/CreateURL时,将得到一个可以输入数据的空白表单,如图2.5所示。2.4.1非数据库类DataAnnotation启用验证图2.5Create.aspx视图但是,由于我们还没有在应用中实现任何验证,因此无法阻止用户在表单中输入不合法的内容,然后将其提交到服务器中。第二章模型2.4模型的数据校验Step02:使用DataAnnotation来启用验证。现在,让我们来更新应用,执行一些基本的输入验证规则。我们将在Person模型对象上实现这些规则,而不是在控制器或视图中实现。在Person对象上实现这些规则的好处:这将确保这些验证在应用中任何使用Person对象的场景中都会执行(假如后来添加了编辑场景的话),从而避免在多处重复这些规则。ASP.NETMVC4允许开发人员轻松地在模型或视图模型类上添加声明式验证,然后ASP.NETMVC在应用中实施模型绑定操作时,这些验证规则就会自动执行。举例来说,让我们更新Person类,在其中添加几个验证特性,这样做的话,将在文件的顶部添加一条对“System.ComponentModel.DataAnnotations”命名空间的“using”语句,然后在Person的属性上使用[Required]、[StringLength]、[Range]和[RegularExpression]验证特性(这几个特性都是在那个命名空间中实现的)。2.4.1非数据库类DataAnnotation启用验证第二章模型2.4模型的数据校验既然添加了验证特性到Person类,那么现在来重新运行我们的应用,此时需要查看在输入不合法输入项并将其提交回服务器时会发生什么,如图2.6所示。2.4.1非数据库类DataAnnotation启用验证图2.6验证效果第二章模型2.4模型的数据校验从图2.6我们可以看出,此例是一个不错的校验体验,带不合法输入的文本元素以红色高亮显示,我们指定的验证错误消息也显示给了用户。另外,表单还保留用户原先输入的数据,这样他们不用重新填写什么。上述内容究竟如何实现呢?要理解这个行为,让我们看一下处理表单的POST场景的Createaction方法。2.4.1非数据库类DataAnnotation启用验证第二章模型2.4模型的数据校验在我们的HTML表单提交回服务器时,上面的方法就会被调用。因为该action方法接收一个“Person”对象为参数,所以ASP.NETMVC会创建一个Person对象,自动将传输进来的表单输入数值映射到该对象上。作为该过程的一部分,ASP.NETMVC还会检查该Person对象上的DataAnnotation验证特性是否合法。如果一切都合法,那么我们代码中的ModelState.IsValid检查就会返回“true”,在这种情形下,我们(最终)将把该Person对象保存到数据库中,然后重定向到主页。如果Person对象上有任何验证错误,那么action方法就会以该不合法Person对象的数据重新显示表单,这是通过上面代码片段中最后一条代码语句实现的。然后,错误消息就会显示在我们的视图中,因为Create表单在每一个<%:Html.TextBoxFor()%>辅助方法的调用旁都有一个<%:Html.ValidationMessageFor()%>辅助方法调用。Html.ValidationMessageFor()辅助方法会针对传入视图的任何不合法的模型属性输出合适的错误消息。2.4.1非数据库类DataAnnotation启用验证第二章模型2.4模型的数据校验这个模式/方式有一个好处,就是非常容易配置。另外,它还允许我们轻松地添加或改变Person类上的验证规则,而不必改变控制器或视图中的任何代码。这个在一个地方指定验证规则,然后在所有的地方都会被承诺和遵守的能力,允许我们以最小的努力快速地发展我们的应用和规则。2.4.1非数据库类DataAnnotation启用验证第二章模型2.4模型的数据校验Step03:启用客户端验证。目前我们的应用只能做服务器端的验证,这意味着我们的终端用户需要将表单提交到服务器才能看到任何验证错误消息。ASP.NETMVC4的验证架构中有一个非常不错的功能,那就是它同时支持服务器端和客户端验证。如果要启用这个功能,那么我们要做的就是在视图中添加两个JavaScript引用,即编写下面的代码。2.4.1非数据库类DataAnnotation启用验证在添加了上述代码语句后,ASP.NETMVC4就会使用我们添加到Person类上的验证元数据,为我们连接好客户端JavaScript验证逻辑。这意味着,当用户使用<Tab>键跳出一个不合法的输入元素时,就会得到瞬时的验证错误,如图2.7(见下页)所示。第二章模型2.4模型的数据校验让我们重新运行应用,在“FirstName”、“LastName”和“Email”文本框中输入合法的数值,然后尝试单击“Create”按钮,发现会有错误提示,如图2.8所示。注意,其实我们不必访问服务器就会得到超出年龄范围值的瞬时错误消息。2.4.1非数据库类DataAnnotation启用验证图2.7瞬时的验证错误图2.8提交后的验证错误第二章模型2.4模型的数据校验这项技术带来的好处是,我们不必编写自己的任何JavaScript就能启用上面的验证逻辑。我们可以在一个地方指定规则,然后在整个应用中得到执行,即同时在客户端和服务器端。值得读者注意的是,由于安全的原因,服务器端验证规则总是执行的,即使用户启用了客户端支持。这是为了避免黑客尝试绕过客户端规则,“哄骗”攻击(spoof)用户的服务器。ASP.NETMVC4中的客户端JavaScript验证支持可与用户在ASP.NETMVC应用中使用的任何验证框架/引擎协作,它并不要求用户使用DataAnnotation验证方式,所有的基础设施是独立于DataAnnotation的,可以与Castle验证器、EntLib验证应用块,或者用户选择的任何定制验证方案协作使用。如果用户不想使用我们的客户端JavaScript文件,那么也可以将其替换成jQuery验证插件,而使用那个库。ASP.NETMVCFutures的下载包还包括针对ASP.NETMVC4服务器端验证框架启用jQuery验证的支持。2.4.1非数据库类DataAnnotation启用验证第二章模型2.4模型的数据校验Step04:创建自定义的[Email]验证特性。.NET框架中的System.ComponentModel.DataAnnotations命名空间包括了众多内置验证特性。在上面的例子中,使用了其中的4个:[Required]、[StringLength]、[Range]和[RegularExpression]。用户也可以定义自己的定制验证特性,然后应用它们。用户可以通过继承自System.ComponentModel.DataAnnotations命名空间中的ValidationAttribute基类,定义完全定制的特性。如果用户只想扩展它们的基本功能,那么也可以选择继承任何现有的验证特性。例如,为了帮助清理Person类中的代码,我们也许想要创建一个新的[Email]验证特性,将检查合法Email的正则表达式封装起来。如果想要这样做的话,那么只要像下列代码那样继承RegularExpressionAttribute基类,然后用合适的Email正则表达式调用RegularExpressionAttribute基类的构造器即可。2.4.1非数据库类DataAnnotation启用验证第二章模型2.4模型的数据校验然后将Person类更新成使用新的[Email]验证属性,换掉先前使用的正则表达式,这样会使得我们的代码更简洁,封装效果也更好。2.4.1非数据库类DataAnnotation启用验证第二章模型2.4模型的数据校验在建立定制的验证特性时,用户还可以在服务器端及客户端指定通过JavaScript执行的验证逻辑。除了建立可用于对象上个别属性的验证特性外,还可以将验证特性用于类的层次,这允许对一个对象中的多个属性实施验证逻辑。若要查看相关案例,可以参阅包含在默认ASP.NETMVC4应用项目模板AccountModels.cs/vb文件中的“PropertiesMustMatchAttribute”定制特性(在VisualStudio2010中,选择“文件”→“新ASP.NETMVC4Web项目”,然后查询该类)。2.4.1非数据库类DataAnnotation启用验证第二章模型2.4模型的数据校验Step05:逻辑层的需求校验。校验中除了基本的长度、必填、范围等之外,还有符合逻辑要求的校验。这些校验除了用上面的自定义方法之外,还可以在控制层进行相关的检验。2.4.1非数据库类DataAnnotation启用验证在上述代码段的相应位置可以自己编写相关的方法进行校验。第二章模型2.4模型的数据校验Step06:逻辑层的需求校验。现在让我们实现将朋友数据保存到数据库所需的逻辑。至此,我们只用了简单的(plain-old)C#类(有时称为“POCO”类,即“plainoldCLR(orC#)object”)。我们可以使用的一个方案是,编写一些单独的持久代码,将已经编写好的现有类映射到数据库。目前,像NHibernate这样的对象关系映射(ObjectRelationalMapping,ORM)方案已经可以非常好地支持POCO/PI这样风格的映射。随.NET4发布的ADO.NET实体框架(EntityFramework,EF)也支持POCO/PI映射,而且就像NHibernate那样,EF也能使用以“只用代码”(codeonly)的方式(没有映射文件,也不需要设计器)定义持久性映射的功能。如果我们的Person对象以这种方式
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 化工风险预警管理制度
- 噪声作业防护管理制度
- 城镇车辆停放管理制度
- 计算机四级的金考点及试题及答案
- 农业企业薪资管理制度
- 后勤总务食堂管理制度
- 工地加强安全管理制度
- 完善旅游用地管理制度
- 周转住房卫生管理制度
- 展会公司财务管理制度
- 2023年八年级历史下册竞赛试卷
- 国民经济行业分类代码表
- 2024年云南省中考历史试卷(附答案)
- 2024-2029年中国无机涂料行业市场现状供需分析及重点企业投资评估规划分析研究报告
- 银行保安员管理考核办法
- MOOC 网络技术与应用-南京邮电大学 中国大学慕课答案
- T-HNCAA 023-2020 混凝土砖单位产品综合能耗限额和计算方法
- 化妆品注册备案资料规范
- 血管瘤护理综合护理方案帮助患者康复
- 北师大版四年级下册5-6《猜数游戏》分层作业
- 国家自然科学基金范例国家自然科学基金项目合作协议书模板
评论
0/150
提交评论