• ASP.NET MVC4 Web 编程第三章


    使用数据

    现在很难找到不处理数据的应用程序,所以对于Asp.net mvc提供各种级别简化数据访问的宽假这一点我们不会感到惊讶,本章将会介绍asp.net mvc 提供支持的这些工具,以及如何通过电子交易网站Ebuy中的驱动场景,使用这些功能来处理数据

    因为Ebuy是个电子交易网站,所以网站最重要的场景就是允许用户创建要销售的商品信息及商品列表,下面来看一下asp.net

     mvc 宽假如何版主我梦处理这种场景。

    构建表单

    Html表单的概念与web一样古老,虽然现在的浏览器已经变得相当强大,可以随意设置我们西黄的Html表单样式,可通过Javascript来控制它们的行为,这些都是5年前可能都无法想像的,但是本质上这些操作,显示以及回传到web服务器的元素人就是一些朴素的旧的表单域。

    虽然mvc框架鼓励我们手工编写更多的Htm代码,但是它也提供了一系列Html版主方法来帮助生成HTML标签,比如html.textbox,html.password和html.hiddenfield等,mvc同样也提供了一些更智能的帮助方法,比如html.labelfor和html。editorfor他们可以根基名称和传入的模型属性来东台的确定合适的Html。

    这些帮助方法就是我们在电子交易网站Ebug用来创建HTM;表单的工具方法,通过这些Html表单方法,用户可以向服务器AUCTIONScONTROLLER.create操作回传新创建的交易信息,要了解如何使用这些版汉族方法,先天加一个名称为create。cshtml视图,然后使用下面的Html标签来填充视图:

     

     接着在控制器里添加下面的操作来显示这个视图:

     这个视图将会渲染下面的Html代码到浏览器

     用户可以在这个页面表单中填写商品数据,并提交给、auctions/create操作,从浏览器角度看,虽然提交数据的地址和开始的页面地址一样(最初的页面表单地址也是/auctions/create),但是现在提交给新数据的是另外一个操作,这个create操作标记了HttpPostAttribute标记属性用来告诉mvc框架,他是用来处理Html表单Post方式提交的操作方法。

    这些添加的代码一旦验证成功,name可以编写逻辑代码来处理这些提交的数据了,但是该怎么做呢?

    处理表单post

    在处理这些传递给控制器操作的数据之前,首先要报这些数据从清气消息中取出来,这样做,的最简但的方式就是把模型当做操作参数,新云的是,我们已经创建了一个模型,auction类为了绑定之前定义的auction类,现在要在操作方法上吧auction模型作为参数类型,代码如下

     此刻,auction模型类最重要的地方就是他的属性名要与html表当中要提交的域元素名称一致,这些属性的名字之光重要,asp.net mvc模型绑定机制会从请求消息中提取这些字段的值,并把他们赋值个iauction模型对象。如果运行网站,填写交易数据并提交Html页面表单,就可以看淡auction模型参数已经赋值了,现在代吗里只是回传了aucton参数的值给视图,并没有做别的处理,我们可以吧这些值新鲜事给用户

    已进行确认,到达这一步,已经非常接近实际项目的需求了,不过实际的代码更加复杂,可能要保存吗数据导数据库,并且放回给用户的视图可能是保存成功的挥着失败的页面,现在就开始编写保存数据的代码。

    保存数据到数据库

    虽然asp.net mvc框架没有直接提供内置的数据库访问支持,但是有很多流行的,net数据访问库可以用来轻易实现数据库访问操作。

    微软的Entity framwork就是其中之一,ef是一个简单,灵活的对象关系映射(orm)框架,它可以使用面向对象的方式帮助开发人员查询,更新存储在数据库中的数据。

    此外,ef实际上也是.net框架的一部分,微软对他提供了全力支持,而且有很多技术文档供我们学习.使用。

    ef提供了一些定义数据模型和使用模型访问数据库的方法,但是最好的方法应该是代码优先方法,这个方法提倡以应用程序模型为中心,并以应用模型驱动整个开发过程。

    使用代码优先方法开发项目时,数据库交互通过简单的模型类进行(朴素的旧对象Plain old)ef代码优先方法非常强大,甚至可以在运行程序时根据我们定义的模型来生成数据库Schema,并使用这个Schema来创建数据库和实体(表,关系等)。

    代码优先方法通过遵守特定的惯例来自动评估模型层中各种属性和模型类的信息,它们之间地关系以及如何使用数据库辨识这些模型关系。

    例如,电子交易网站Ebuy里,Auction模型类映射到数据库中的Auctions表上,而且表中的每个列域模型类的属性一一对应,这个表的列名就是自动从模型类中获取的。

    前面展示的Auction模型类十分简单,但是实际项目中随着应用程序业务逻辑的需要,可能会变得相当复杂,会添加更多的属性,业务逻辑,甚至是与其他模型之间的关系,这些都不是ef代码优化方法关心的但是复杂的模型水葱简单的模型进化而来的,第8章里根据想在的简单auction模型构建了更复杂的auction'模型,证明了ef待吗邮箱可以处理更辅助器的映射关系,当然也有它无法处理的情况。

    使用ef代码邮箱模式创建数据访问层

    ef代码优先模式的核心依赖于system.data.entity.dbcontext类,这个类(或者他的子类)是代码访问数据库的网关,他提供可数据库相关的操作。

    在使用dbcontext类之前,需要先继承它,事实上,编写子类代码非常容易:

     例子Ebuy的DataContext里我们创建了一个自定移动数据上下文类,名字叫EbuyData-Context,它继承自DbContext,这个类定义了一个属性SYstem,data,entity, dbset<t>,t是编辑或保存到数据库的实体对象的类型,上面的例子定义了System.data.entity.dbset<auction>,表示需要保存和编辑Auction对象到数据库,可以在数据上下文里定义多个实体,随着学习的深入,会逐步增加更多的实体(或DBSET属性)到EbuyDataContext类里。

    如果说创建自定义数据上下文很简单,那么使用起来就更加容易了,下面的代码调用了Create操作来保存nAuction对象到数据库里;只需要把Auction对象放到EbuyDataContext,AUCTION机和里,然后保存修改即可。

    ef提供了代码优先模式是ef的一种新开发模式可取代现有的数据库优先模式和模型优先优先模式,代码又想让用户使用clr类定义模型然后将这些类映射到现有数据库有或使用这些类生成数据库架构,具体文章可以参考

     当运行网站并提交填写过的表单页面时,数据库里就会自动添加一条性的信息,如果在修改几次里子尝试一些不同的数据,就会发现asp.net mvc模型绑定十分宽松,用户可以随便输入明只要不把表单提交的书库装换为强类型(例如,当用户输入abc时就无法装换为int类型),只要不把表单提交的数据库装换为强类型(例如,当用户输入abc是就无法装换为int类型),如果需要对保存待数据库的数据进行严格的限制,就需要使用数据验证机制。

    验证数据

    当涉及数据问题时,通常有很多规则和限制可以用,比如,某些字段不能为空,必须在特定的范围内,本质上asp.net mvc 把数据验证作为重要部分集成到请求处理过程中。

    作为控制器操作执行的一部分,asp.net mvc框架验证每个床底给操作的数据是否有效,空志气操作就可以通过查询ModelSTATE来检查请求是否有效。例如,保存有效数据到数据库,后缀返回包含错误提示信息的原始表单给用户。

    这里是AuctionController.Create操作,用于判断Modelstate的有效性后进行“保存或者放回”操作:

    尽管验证代码很有作用,但是并不是只有 asp.net mvc框架才可以对Modelstate添加验证错误,开发者可以自由添加自己的逻辑去发现那些没有被捕获的错误并添加错误验证信息。可以使用Modelstate。ADDmODELERROE

    (STRING KEY,STRING1MESSAGE)方法来添加错误验证信息。

    假设我们交易将持续至少一天时间,换句话说交易的截止日期比当前日期多一天,auctionscontroller.Create操作可以在保存交易之前验证这个逻辑,当然在错误的时候给出提示信息。

     这个方法确实有效,但是他没有分离应用程序的关注点。控制器不应该包含这种业务逻辑,该业务逻辑属于模型,所以要把业务逻辑移到模型里。

    使用数据声明指定业务规则

    确保数据有效性(数据验证)是开发人员必须面对的问题,通常情况下,开发人员都是尽可能的借助现有的框架来完成数据验证工作。

    这个需求非常普遍,实际上微软提供了非常高效,便捷的数据验证API,称为数据标注,属于。net框架的核心部分,物如其名,数据标注api提供了一系列。net标记属性,开发人员可以直接标记在数据对象的属性上,这些标记属性提供了设置验证规则的声明式方式。

    asp.net mvc模型绑定提供了数据标记支持,不需要任何而外的配置,为了学习asp.net  mvc数据标记,我们来看一下Auction类的验证应用过程,为了使用验证逻辑,首相要考虑生me是期望的auction属性值,哪些字段是必须的,哪些字段必须在特定的范围内才算有效?

    必填字段

    因为auction的title和description对出售的商品至关重要,所以要给这两个属性标记RequiredAttribute,以便验证数据的有效性;

    除了标记自字段为必须的Required外,还可以确保字符长度满足了最短长度的StringLengthAttribute属性标记要求,例如,如果决定了auction标题的长度最多50个字就可以通过这个属性来强化控制:

     如果用户提交的Title长度超过50个字符,asp.net mvc 模型验证就会失败。

    验证范围

    接下来要考虑商品的起始价格:有startprice属性表示,使用decimal类型,应为decimal是一个值类型,startPricr默认为0,所以就没必要标记为必填字段,但是交易的起始价格有何逻辑超过了必填字段的范围,,因为这个逻辑值永远不能为负数,附属意味着卖家一开始就是欠账的为了处理这个问题,需要使用rangAttribute属性类标记StartPrice字段,最小值是1,应为Rangattribute需要一个最大值,所以可以指定一个最大值作为上限:

     

     这个例子的区间使用了Double类型,RangeAttribute标记属性还有一重载(Range(Type type,string min,string max))可以满足任何实现了Icomparable的类型,最好的例子就是日期范围的验证,例如,确保日期晚于某个特定的时间点:

     这个例子确保EndTime属性的值晚于2012年1月1日。

    .net标记属性参数必须是编译时的值,在运行时无法修改而且不允许使用像Datetime.now这样的只来设置范围,必须使用固定的日期,比如1/1/2012.虽然无法保证以后的期期有效,但是至少可以保目前设置在

    这种缺乏尊却行是一种选择shiyongRangeAttribute的权衡结果,如果要求有更高的尊确定性,就可以使用自定义验证标记属性CustomValidationattribute,于是就可以执行任意验证代码,虽然这种方法很强大,但是他缺少声明的方法,限制了其他组件的可用信息,比如asp.net mvc 客户端验证框架。

    自定义错误信息

    最后要重点提到的是,数据标记提供了ErroeMessage属性,可以指定返回给客户的错误信息,而不是由Data annotation apl生成的默认信息,现在吧使用数据标记睡醒的模型都指定值,下面的类应该包含了上面讨论的所有数据标记情况:

     既然模型已经定义了所有的验证逻辑,name就在看看控制器和视图时如何返回错误信息给用户的

    显示验证错误

    可以通过在create操作里设置断点来查看验证规则,只要提交五香的值,然后观察Modelstate属性来验证错误是什么就可以了,事实上,控制器返回Create视图,而不是保存行的交易数据,这恰恰证明了验证规则的正确性以及验证框架的有效性,索然create视图显示了无效红边框,但是还是没返回任何错误信息来明确告诉用户那里错了,所以,我们需要注意这个问题。

    这是显示Title1属性的代码:

     我们需要做的就是添加与Title相关的验证信息,最简单的方式就是查看ModelState通过viewdata。modelstate和biewdata,modelstate【“title”】返回的与Title属性相关的错误提示信息。

    我们可以迭代这个集合包错误信息渲染到页面上,代码如下

     虽然这个方法不错,但是mvc提供了更好的方法来渲染特定睡醒的错误提示信息;html.validationmessage(string modelname)帮助方法,他可以让我们省去上面复杂的循环代码,只需要一行调用代码就可以达到同样的效果:

     为模型里的每个属性都添加调用Html.validationmessage()方法的代码,mvc会在相关的控件右边渲染出于验证有关的错误提示信息。

    除了使用属性级别的Html.validationMessage()帮助方法外,mvc也提供看了Html.validationSummary(),它可以帮助我们在有个地方渲染显示验证异常信息(例如表单的顶部,给一个用户一个摘要提示信息,以方便用户修正错误,正确提交表单。)

     当用户提交无效值是,我们可以在两个地方卡到错误提示信息,及顶部的汇总信息和控件后年的错误提示信息如图3-1所示

     如果想避免重福显示错误信息则可以修改调用HTML.valdation1message()的代码,指定更短的自定义错误提示信息,比如简单的型号*,如下:

     下面是说那个了验证标签后的create视图文Joan的所有代码:

     

     目前展示的验证的欧式服务端代码验证,需要在服务器和客户端之间进行几回合的交互过程才能验证数据的有效性,并返回渲染过的视图结果。

    这个方法虽然有效,但不是必须的,第四章展示了如何实现客户端验证与性能优化,不是所有的验证都在浏览器李金星没这可以避免不必要地请求,节约贷款和服务器资源。

    总结

    本章讨论了如何使用ef代码有限方法创建应用程序,并实现与数据库相关的操作,我们看到了使用ef的强大之处,只需要几行代码,不需要编写复杂的架构图或者SQL语句就可以实现数据库操作,我们也讨论了fe如何遵守,惯例优先配置原则,来自动工作,以及一些简单的惯例原则,后面同样也讨论了如何使用mvc的模型判定功能从请求消息中提取状态对象,最后介绍了如何验证数据并提供错误提示信息。

  • 相关阅读:
    django-ForeignKey,OneToOneField,ManyToManyField
    django-HttpResponse,render,redirect
    django-常见问题勘误
    django-个人网站之环境配置(一)
    django-表单之数据保存(七)
    django-表单之模型表单渲染(六)
    django-表单之手动渲染(五)
    Linux内核中_IO,_IOR,_IOW,_IOWR宏的用法与解析
    流媒体传输协议详解之---RTSP认证
    在YUV图像上根据背景色实现OSD反色
  • 原文地址:https://www.cnblogs.com/555556J/p/13586023.html
Copyright © 2020-2023  润新知