zoukankan      html  css  js  c++  java
  • ASP.NET MVC4 Web 编程第一章

    了解过去是为了更好地面向未来,在开始学习ASP.NET MVC之前,先花一点时间来了解一下器历史背景

    很久以前,微软看到基于windows系统的Web开发平台的需求后就提供了自己的解决方案再过去的20年中,微软已经向开发社区提供了多个web开发平台。

    微软的第一个web开发平台是ASP,它将脚本语言和代码防置于同一文件里,网站里的每一个页面对应一个物理文件,至今,仍有很多ASP网站还在运行,随着时间的推移,开发人员希望得到更多地支持,希望改进代码的复用性,更好地分离关注点以及更方便的进行面向对象的编程开发,在2002年,微软提供了一个新的web开发平台-asp.net来满足这些需求

    与asp一样asp.net网站也提供了基于页面的方式,每个页面对应一个物理文件,称为webForm(web表单),并且可以通过文件名访问,与asp不同的是,webform页面提供了代码分离机制,把代码文件和Html标签分离到两个不同的文件中,asp.net web form已经发展了很多年,但仍是很多开发人员的选择之一。也有一些.net开发者认为ASP.net web form 过于抽象了底层的HTML,Javascript和css!

    微软很快发现了asp.net开发人员的新需求,这些需求不同于之前基于页面的WEB form方法,于是,微软在2008年发布了第一版Asp.net MVC.这与之前的WEB FORM方法完全不同,Asp.net MVC抛弃了基于页面的架构风格,使用了全新的MVC架构。

    与asp.net web form 取代asp不同,asp.net mvc并没有取代ASP.NETweb form的意思恰恰相反,ASP.NET MVC和asp.net web form 可以共存,他们否构建于ASP.NET框架之上,并且都使用了很多相同的WebAPI ASP.NET MVC 和asp.net web form 只是开发ASP.net 网站的不同方法,这是贯穿本书的基本观点,第二章和附录A对这些概念做了更深入的介绍。

    mvc模式是一种严格实现应用程序各部分隔离的架构模式。这种“隔离有一个更响亮的名字“分离关注点”,更通俗的名称是“松耦合”。实际上。mvc架构包括后面的ASP.NET MVC 框架,都是以实现应用程序模块之前的隔离为目标的

    松耦合的应用程序架构设计方式,无论是短期还是长期,都能带来巨大的好处。

    开发

    单个组件不直接依赖于其他组件,这就意味着每个组件可以独立部署,也可以被替换,这种不使用单一文件编译组件的方式减少了与之相关的组件之间的影响。

    测试组件之间的松耦合带来的好处就是允许测试代码可以替换真是的产品组件,这样可以尽量减少直接调用数据库,可以直接让数据库调用组件返回静态数据,这种牟利测试大大的简化提升了系统的真实性测试流程。

    维护

    隔离组件逻辑意味着把影响隔离到最少的组件中,通常只有一个,改变的风险通常和组件影响的范围有关系,改变的数量越少,影响就越小,这是想而易见的。

    MVC模式把应用程序分割为三层,模型,视图,和控制器。每层拥有特定的职责,而且不需要关注其他层如何工作

    模型代表这核心的业务逻辑和数据,模型封装了域实体的属性和行为,并暴露除了实体的属性。列如,Auction类代表“拍卖”的逻辑概念,暴露了一些属性,入Title和CurrentBid,同时也包括表示行为的一些方法如Bid();

    视图负责装换模型并把它传递为表示层,在web应用中,虽然视图有多种形式,但是通常指的是生成哪些可以子用户浏览器中渲染的Html代码,相同的模型可以在Html。pdf。xml,甚至Excel电子表格展示。

    遵循“分离关注点”的原则,视图应该关注与如何展示数据,而不应该包含任何业务逻辑业务逻辑封装在模型中,这些模型可以提供视图需要的任何东西。

    控制器控制程序的逻辑,并且充当着视图和模型层之间协调的角色,控制器从视图层接收用户输入的信息,然后使用模型来执行特定的操作,并把最终的结果回传给视图。

    本书将会深入解析ASP.NET MVC框架,介绍此框架提供的绝大部分特性和功能,因为现在asp.net mvc 已经到了4。0版本,除了介绍最新的特性外,本书同样介绍整个框架得到基本概念,以方便大家学习。

    下面首先会对最新ASP.NET MVC 4.0版本做一个简单的介绍,然后会详细介绍这些新特性。

    异步控制器

    iis会使用新线程来处理每个请求,所以每个新请求与IIS的有限可用线程息息相关,甚至包括那些空闲的线程(例如,等待数据库查询或者web服务返回结果的线程)。在.net框架4.0和IIS 7中已经大幅增加了默认线程池的线程数量,尽量避免长时间独占资源仍然是最好的实践开发原则,为了更好地处理这种耗时很长的请求,asp。net mvc 4.0引入了异步控制器机制,通过使用异步控制器,就可以告诉框架释放处理长请求的线程,在等待期间优先去完成其他任务一旦这些临时任务结束,asp.net mvc框架就会让此线程返回到之前的长请求任务上明只要异步控制器正常执行完成,一样会返回结果,只是想在可以同时处理更多地请求,如果对异步控制器内容感兴趣,可以查看第11章的内容,那里有更深入的介绍。

    随着移动设备数量的增长,普通用户要求使用移动终端在互联网上冲浪,访问不同的网站,所以我们必须做好准备,大部分情况下,移动设备上的数据显示模式与传统的PC桌面应用的一样,除了一些特定的专为移动设备设计的图形元素外。asp.netmvc显示模式提供了更便捷的针对不同移动设备的显示方式。第十章介绍了如何在自己的网站里使用这种显示模式以支持移动设备。

    绑定与压缩

    尽管现在可以通过更快的网速来访问互联网,但是这并不意味着了以随时开发网站而忽略可户端体验,事实上,只有完全了解各种资源的下载过程以及耗费的琐碎时间,才能理解这些问题对网站速度的负面影响,诸如Javascript。css合并已机压缩或许已经不算是新鲜的概念了,但是仍然非常有用,况且。netframwork 4.5已经正式发布,现已经程为整个ASP.NET 框架的基础了,跟确切德朔 asp。net mvc封装何苦鏖战可。net框架的核心功能,以便与我们在asp。net mvc开发中更方便的使用这些功能,第13章详细介绍了这些概念,并且演示了如何使用asp。net MVC框架提供的工具。

    web api 简单的HTTP数据服务迅速成为应用程序,设备和凭条提供数据的首选方式。asp.net mvc 可以返回各种格式的数据,包括json和xml,而asp.net web api还能简化这些步骤,相比控制器的操作方法,它还能返回更加多样化的数据,第六章将会介绍如何使用ajax客户端以及如何使用asp.net web api服务实现ajax交互。

    本书不仅简单介绍了ASP.NET MVC 框架概念,还将介绍如何使用这个框架进行真实的项目开发,“真实意味着他不仅是个简单的Demo程序,还必须具有一定分复杂性。

    为了能够尽量演示读着可能遇到的每个问题,本书已经收集了一个清单,包含相关开发人员最常遇到的问题和场景,以及能够从别处听到的最常见的问题,这个清单也许并不能包含开发中遇到的所有问题,但确实可以代表大部分开发人员在使用ASP.NET MVC开发过程中遇到的大部分问题。

    为了包含列表里的全部场景我们设计,开发了一个人人都能理解的Web应用程序在线交易的电子商务网站,尽量接近真实的项目。

    引入Ebuy使用asp。netmvc开发在线交易网站,从更高层次上说,这个网站相当简单,允许用户发布自己想要出售的商品,允许顾客购买自己想要的商品,假如要深入学习,将会发现程序比想象的复杂,不仅需要asp。netmvc还需要集成其他的技术。

    ebuy并不是一堆随书下载的示列代码本书的每个章节不仅要介绍其特性和功能还要使用他们开开发ebuy应用程序,从新建项目逮捕书项目,最好能在阅读本书的时候一起根治编写代码。

    为了开发asp。netmvc应用,需要秀安下载并安装asp.netmvc4框架,可以通过访问asp.net mvc官方网站并点击安装按钮下载并安装asp。net。mvc

    注意为了安装asp。net mvc4,必须安装PowerShell2.0和visial studio2010 service Pack 1或者Visual web Developer Express 2010 ,假如没有安装 web Platform Installer会哦提示,并且自动下载,安装最新版本的Powershell和visial studio。

    asp。net mvc 4 安装器新增了一种Visal syudio项目类型-asp。net mvc4 web application 这是asp。net mvc世界的入口,我们可以用它来创建asp。net mvcEbuy网上交易网站

    为了穿建新项目需要先选择visualc#语言然后选择在输入网站名臣点击ok就会卡丹岛另外一个带有更多选项的界面,会要求定制mvc4应用程序,然后visalstudio就会创建指定的ASP

    一旦配置好开发环境,接下来就开已进行下一步工作了,创建我们的第一个asp。net mvc4应用程序。

     

     

     asp.net mvc4提供了几种不同的项目模板用于满足不同的场景。

    空模板

    空模板用于创建asp。net mvc4网站的架构,包含基本的文件夹结构,以及需要引用的asp。net mvc程序集,也包含可能要是用的Javascript库,模板同样包含默认的视图布局。以及标准配置代码的Global.asax文件,绝大部分asp。net mvc应用程序都会用到这些代码。

    基本模板

    基本模板按照asp。netmvc4的规则创建了文件夹结构,包含asp.net mvc程序集的引用。这些模板表明了创建asp。netmvc4项目所需要的最低标准的资源,现在我们可以从这个项目开始工作啦,

    互联网应用程序模板互联网应用程序模板,他进行了扩展,包含简单的默认控制器,账户控制器,账户控制器包含用户注册和登记网站所需要的基本逻辑代码,以及这两个控制器需要的默认视图文件。

    以太网应用程序模板

    以太网应用程序模板与互联网应用程序模板很象,使用了基于windows的验证机制,这也是企业局域网安全验证的首选机制。

    移动应用程序模板

    移动应用程序模板是互联网应用程序模板的一个变种,这个模板针对移动设备进行了优化,而且包含了jquery mobile javascript框架以及jquery mobile完美兼容的视图模板。

    web api

    web api模板是互联网应用程序模板的变种,它预定义了web api控制器,web api是一种新的轻量级的Resyful http web服务框架,可以与asp。net mvc无缝集成。web api是创建支持ajax交互数据服务的首选,可以非常方便的用于创建这种轻量级服务,第六章详细介绍了Web api(译注1)。

    新的asp项目对话框可用于选择视图引擎,以及要使用的语法,我们将会使用Razor来开发Ebuy网站,所以就选择默认的Razor选项,毫无疑问,也可以随时修改使用别的视图引擎,这个选项,只是告诉向导可以创建的视图引擎类型,而不是说把视图引擎固定死了。

    最后选择是否要给这个解决方案创建单元测试项目,其实,不需要担心这个设置,因为与其他大的Visiual studio解决方案一样,只要我们高兴,就可以给asp。net mvc 网站程序随时添加单元测试项目

    如果对这些设置比较满意那就点击“OK”按钮,让向导创建新的项目吧!

    NUget包管理器

    如果查看visual studio里新项目的状态栏,就会注意到有一些消息(诸如“安装aspnetmvc....”),这是因为当前的项目正在使用NuGet包管理器去管理和安装当前项目使用的程序集,使用包管理器去管理程序依赖的概念(特别是新项目)非常有用,当然也包括asp。net mvc4项目。

    NuGET提供了全新的程序依赖的管理方式,开始引入asp。net mvc 3框架,虽然它不是asp。net mvc框架的一部分但是对项目开发确实非常方便。

    nuget也许要包含程序集,内容甚至工具

    在安装包的过程中,nuget会自动加载程序集到项目引用列表,添加内容到程序文件夹,并注册nuget可能使用的工具到相应的路径。

    但是包最重要的方面实际上是依赖管理,,net程序不是隔离的单程序集应用(大部分程序集需要引用别的程序集来进行自己的工作),更重要的是程序集往往要依赖于特定的版本(或者至少是最低版本)。

    总之Nuget 会自动计算需要使用的程序集之间的关系然后确定需要哪些程序集以及这些程序就的准确版本。要是用,可以通过包管理器进行,有以下两种方式。

    图形用户界面

    包管理器带有图形用户界面可以很方便进行查找安装,更新以及卸载操作,通过右键点击解决方案里的项目,选择就可以打开Muget用户界面。

    控制台模式

    类库包管理控制要是个窗口,它集成了如果在里找不到它,则可以通过工具类库包管理器,包管理控制台菜单来访问,为了安装包管理控制台窗口,只需要输入install -package name——命令即可,列如为了安装entitiy framwork包只要执行install -packageentityframwork命令即可。包管理器控制台会自动=下载entityframwork包并安装到项目里,在install-package命令完成后,就可以在项目有=引用的列表里看到entity famwork程序集。

    惯例优先原则

    为了简化web开发,提升开发人员的工作效率asp。netmvc依赖于“惯例优先原则”这意味着asp。net mvc会嘉定开发人员遵守特定的惯例来构建自己的程序而不是使用配置文件。

    图1-4所示asp。netmvc项目文件架结构是“惯例优先原则”最好的例子,这里有三个元素对应于mvc架构模式:控制器,模型和视图文件夹,结构一目了然,相当清晰!

     当仔细看这些文件夹是,就会发现更多的“惯例”。列如,不仅是控制器文件夹包括所有的控制器类,而且每个控制器类都以controller结尾。整个mvc框架都使用这个惯例来注册控制器,并将他们与相应的路由器关联。

    接下来,看看视图文件夹,这个惯例没这么明显,但是可以在视图文件夹内部看到shared文件夹以及每个控制器对应的文件夹吗,这个惯例可以帮助开发人员清晰的掌握自己向用户展示的视图位置,开发人员也可以只提供一个名为index的视图,这样mvc框架会尽一切能力在views文件夹里查找它,首先在控制器指定的文件夹里查找,如过找不到,再到shaerd视图文件夹里查找。

    咋一看“惯例优先原则有点琐碎但是这些看似微小或者毫无意义的优化措施确实能够节约时间,改善代码的可读性以提高开发人员的效率。”

    惯例优先原则,是一种开发设计模式,指的是在项目开发过程中,尽量使用事先约定的习惯来命名,减少开发人员的疑惑,简化开发流程,而又不失灵活性,比如模型有个类sales数据库自然就有喝表sales这就是设计开发的惯例

    项目创建一旦完成,点击F5键就可以运行asp.net mvc网站了,在浏览器其中可以看到它的样子。

    恭喜你已经成功创建了一个asp.net mvc4程序。

    看到网页中展示的文字时,你也许非常激动。

    图1-5展示了ASP.NET MVC处理请求的过程。

     尽管本书的其余内容会深入讲解这个图中的组件,但是下面还会先介绍asp.net mvc的基本模块。

    路由R鸥汀

    所有的asp.net mvc

    请求开始与其他的网站一样,使用一个带有url的请求,这意味着尽管没有到处提及路由,但是asp.net routing 仍然是asp.net mvc请求的核心。

    简单来说,asp.net路由只是个模式匹配系统,开始时,应用程序使用路由表注册一种或者多种模式,告诉路由系统如何处理这些与模式匹配的请求,路由引擎在运行时接收到请求以后它就会根据事先注册的URL模式匹配当前请求的URL,如图1-6所示。

     配置路由

    asp.net mvc路由负责确定由哪个控制器操作来处理特定的URL请求,它由一下属性组成。Unique name 路由唯一的名字。url pattern 将url解析成有意义词语的简单模式语法。 defaults url模式里定义的参数变量的默认值。

     constraints为url匹配模式定义

    默认的ASP.net mvc 项目添加了一个通用的路由,他是用一下url习惯来解析特定的URL请求,即分三个部分,包含在大括号内,controller,action,id。

    注册路由使用的扩展方法时MapRoute,在程序启动的时候注册

     除了name和urlpattern外,路由器同样定义了模式匹配事件中使用的一系列默认参数,但是机上并没有给每个参数提供默认值。

    列如表1-1包含了匹配这个路由的所有url及与之对应的值

     表中的第一个url(/auctions/auction/1234)完美匹配了路由模式,他符合路由模式各个部分的定义,但是,如果继续往下看这个表,逐渐移除url的各个部分,就会发现那些url未提供的默认值。

    这是一个asp。net mvc如何使用”惯例优先原则”的非常重要的列子之一,当应用程序启动时。asp。net mvc会在程序集里查找所有可用的控制器,这些控制器类都继承子sysytem。web。mvc。icontroller接口或它的子类,并且名字带有controller后缀,当路由器框架确定需要访问的控制器以后,他就会去掉后缀,来获取控制器类的名称,所以但需要使用控制器时,直接使用它的简称即可,比如auctioncontroller值得控制器类是auctions,而homecontroller指的就是home。另外值得注意的是,路由中的控制器和操作社会不区分大小写,这意味着甚至都可以即系到操作上

    url路由模式对应程序根目录,所以不需要以“/”作为开始符,或者使用虚拟路径指示符“~/”.包含此字符的路由模式的三个字符串都是无效的,强制使用将会导致路有异常。

    也许你已经看到了,url路由包含了路由引擎可以提取的丰富信息,为了处理asp.net mvc请求,路由引擎必须能能够确定两个关键信息。控制器和操作,运行时路由引擎会把这些值传递给asp.net mvc 去创建和执行特定的控制器和操作。

    控制器

    在mvc架构模式的上下文里,控制器响应用户的输入(比如,用户点击“保存”按钮)并协调模型,视图以及(经常)数据访问层,在asp.netmvc程序里,控制器就是包含被路由框架处理请求时调用的方法的类。

    下面看看asp.net mvc 控制器的列子HomeController类,位于Controllers/HomeController里

     控制器类并无什么特别之处,跟别的.net类几乎没什么区别,事实上,控制器类里的方法(称为控制器的操作,做了处理请求过程中的主要工作)

    经常听到控制器和控制器操作这种词语,在本书里也这样称呼,其实mvc模型并不会区分二者,但是asp.net mvc框架十分关注控制器操作,因为它包含了处理请求的实际逻辑代码。

    列如HomeController类包含三个操作:Index,About和contant,然而,假设默认的路由模式是controller、action、id,当一个请求的url是home、ablout时,路由框架会决定homeController类中的about方法来处理这个请求,随后asp.netmvc框架会创建Homecontroller的实例并执行about方法

    这个例子中,about方法非常的简单,他通过ViewBag属性把数据传递给视图(后面会详细介绍),然后asp.net mvc框架通过调用View()方法来显示名为about的视图,这个操作返回一个ViewResult类型的操作结果。

    操作结果

    值得注意的是控制器,的工作就是告诉asp.net mvc 框架下一步应该做什么,而不是怎么做,这个沟通过程通过使用+actionResuklt来实现,返回中就是控制器提供的操作。

    列如,当控制器决定如何显示视图时,他就会告诉asp.net mvc框架通过返回ViewResult来展示视图,而不会自己渲染视图,这种送耦合的设计,也是操作中“分离关注点”原则的直接体现(应该干什么和怎么干)

    尽管每个控制器的操作都要返回ActionResult,但是大部分时间不需要你动手完成,相反,只需要使用SYSTEM.web.Mvc.controller基类提供的帮助方法即可,例如:

     虽然所有的操作都要求提供结果已决定下一步请求的处理操作,但并不是所有的控制器操作都需要制定他们的返回类型,控制器操作可以指定任何ActionResult子类作为返回类型,甚至别的任意类型。

    当Asp.net mvc框架遇到一个非ActionResuult类型作为返回控制器操作结果时,会自动在ContentResult里进行包装并渲染原始内容。

    操作参数

    控制器操作,当单独来看时和别的方法没什么两样,事实上,当执行操作室,控制器操作甚至可以使用asp.net mvc请求消息发送过来的参数,这种功能称为“模型绑定”,而且也是asp.net mvc最强大,最有用的特性。

    在深入学习模型绑定之前,先来回顾传统的请求传值方式

     在这个特定的列子里,控制器的操作使用请求传递的值来实例化Auction对象,因为Auction的属性类型并非是基本类型string,所以操作代码还需要尽量进行类型转换。

    这个列子看起来简单,但是却十分脆弱;只要任何一种类型解析失败,整个操作就会失败。如果是用TryParse()方法也许可以避免大部分异常,但是这意味着要使用更多额外的代码。

    传统的Asp。net传值方式包括url传值。session传值,视图状态传值以及数据库,文件传值等。

    这种方法的副作用非常明显,这种代码把责任丢给了你,一个“苦逼”的程序员去做所有工作,并且每次工作的时候都要执行必要的检查,大量的代码也许会掩盖操作的真正目的,在这个列子里,只要增加一个新的Auction交易对象到系统里。

    模型绑定的基本概念

    模型绑定不仅可以避免使用大量显示代码,而且使用方便。

    列如和之前的控制操作一样,一下方法使用了模型绑定方法参数;

     现在就不需要从Request对象里解析数据了。因为操作方法已经声明了这些值作为参数。当asp.net mvc 框架执行这个方法时它会自动给操作的方法赋值,注意,尽管我们没有直接访问Request的字典,但这些参数仍然十分重要,因为他们仍然与Request对象里的值一一对应。

    Request对象并不是asp.net mvc模型绑定器获取值的唯一方式,事实上,mvc框架可从几个地方查找需要的值,比如,路由数据,查询字符串参数,Post提交的数据值,甚至一些序列化的JSON对象,例如下面一段代码实现了如何通过相同的名字从URL取值:

     asp.net mvc 模型绑定器在哪里查找以及如何查找值都是可以配置和扩展的,第8章就asp.netmvc的模型绑定进行了深入的讨论

    正如例子演示的模型绑定让asp。netmvc 处理了大量繁琐的基础工作,让操作代码可以专注于提供业务逻辑上,剩下的代码不仅更加有意义,而且更加具备可读性。

    模型绑定复杂对象

    使用模型绑定方法,不管是不是简单的基于类型,都可让代码更加简洁,直观,但在现实世界中,事情往往非常复杂,只有简单的场景才需要简单的几个参数

    幸运的是,asp.net mvc同样支持绑定复杂的数据类型

    下面这个例子的Create操作需要传递一个参数,这次直接使用了Auction对象;

    public ActionResult Create(Auction auction){}

    这个代码与之前的例子一样,没错asp.net mvc 的复杂数据绑定机制去除了创建Auction对象需要的繁琐代码,这个例子展示了模型绑定的真正优势。

    操作过滤器

    操作过滤器通过提供更加简单强大的机制去修改或者增强asp.net mvc管道,在特定的点注入逻辑,帮助处理贯穿程序中各个模块的横切关注点问题。应用程序日志就是典型的横切关注点的列子,无论组件的主要职责是什么,日志贯穿于应用程序的任何模块。

    操作过滤器逻辑首先是通过将ActionFilterAttribute属性标记到操作上来影响操作的执行,正如下面的例子里所设置的,他可以保护任何未授权的访问操作;

     asp.NET MVC 框架包含一些特定场景的操作过滤器,本书将介绍这些操作过滤器,一帮猪我们使用更加简洁,松耦合的方式来完成不同的工作。

    操作过滤器确实实在网站中应用定制化逻辑的很好的方式,记住,可以通过扩展ActionFileterAttribute或任意一个ASP.net mvc过滤器来创建自己的操作过滤器。

    横切关注点和aop方面的编程有关,在传统的软件开发过程中,除了竖向分布的关注点模块外,还有些关注点的实现会谜尚在真个软件内部,这时这些关注点同主关注点是横切的,比如日志,异常处理以及验证授权等。

    视图

    在asp.net mvc框架中,想要返回给用户HTML的控制器操作,就要返回ActionResult类型的ViewResult实例,ActionResult知道如何渲染应答结果,当渲染视图时,asp.net mvc将会使用控制器提供的名字。

    以HomeController的Index操作为例,如下:

     

     这个操作将会使用帮助View()来创建ViewResult无参调用View(),与例子里一样,asp.net MVC会找到一个和当前操作一样的视图名字,在这个例子里,asp.net mvc 将会查找名为Index的视图,但是去哪里找他呢?

    定位视图

    asp.net mvc 依赖惯例是在网站根目录下面的Views文件夹查找这个视图文件,更确切的说,asp.net MVC 希望视图文件放在以它们对应的控制器名字命名的文件夹中。

    因此如果MVC框架想为HomeController的Index操作显示视图,那么他就要在/view/home文件夹下查找名为Index的文件,图1-7展示了项目模板截图,已经包含了一个Index.cshtml的视图文件(译注5)

    如果在Views文件夹下没有找到对应的视图文件,Asp.net mvc框架就会继续在/VIEWS/shared文件夹中查找。

    /view/shared文件夹是保存共享多个及控制器视图的绝佳位置

    这里的跨越多个控制器的视图文件是指诸如网站页面的顶部导航栏,底部声明信息等共享部分的页面内容。

    既然已经知道了操作请求的视图,现在就来看看视图文件包含什么内容,html标签和代码。但他并非仅仅是html标签和代码它是Razor!

    Razor,你好

    Razor是哟中允许吧代码和内容进行平滑继承的语法,尽管它引入快乐一些新的符号和关键字,但是Razor并不是一种新的语法,相反,Razor允许用户使用已知的语言来编写代码,比如c#或者VB.NET.

    Razor的学习门槛很低因为它云溪使用已经具备的技能,而不要求学习一种新的语言,因此,如果知道如何编写Html或者使用C# VB。NET编写代码,就可以轻易编写下面类似的代码;

    <div>This page rendered at @DateTime.Now</div>

    这些代码会输出

    <div>This page rendered at 12/7/1941 7:38:00 am</div>

    这个列子以标签开头,然后是一些硬编码文本,。然后就是动态内容,引用了.net的时间类型(system.datetime.now),最后是HTML结束符(</div>)

    Razor智能感知解析器允许用户编写更复杂的逻辑代码,而且可以在代码和标签之间轻易转换,虽然Razor语法与其他的标记语法不同(比如asp.net web form),但是它们的目标都是相同的就是渲染HTML.

    为了说明这一点,现在来看下面的例子,在Razor和ASP.net web form标签里实现同样的功能。这里是一个使用if/else语句的web form语法列子:

     以下这个foreach循环使用了Webform的语法。

    使用Razor语法的代码如下:

     Razor提供了两种不同的方式区分代码和标签;代码段和代码块。

    代码段

    代码段是一些简单的表达式,他们可以在一行中进行渲染,也可以与文本混合,列如

     表达式跟在@之后,Razor能够智能确定左括号的结束部分,上面的列子将会渲染一下的输出结果

     注意这行代码必须一直返回标记代码给视图渲染,如果编写的代码段返回了void,这会在执行视图的时候出错。

    代码块是一段包含代码的视图,他只包含代码,而不是代码和标记语言的混合,Razor定义的代码块要求使用“@{}”包装。“@{}标记开始,中间不确定行数以“}”结尾。

    记住,代码块里的代码与代码段里的代码不同,它只包含代码,而不是代码和标记语言的混合,Razor定义的代码要求使用“@{}”包装,

    记住代码块里的代码与代码段里的代码不同,前者是常规代码,必须符合,当前语言的语法。例如,每行c#代码必须以“;”结尾,这与在.cs文件里编写c#类的代码一样。

    下面是一个典型的代码块例子;

     代码块不能渲染任何东西,相反,他允许用户编写任意没有返回值的代码。

    同样代码块里定义的变量可能被同意个语种的代码段使用,向foreach选焊体里定义的变量只能被容器内的代码访问,而定义在视图顶部的变量可以被相同视图中的代吗块和代码段访问,为了根号的说明这个问题,先看一下包含多个变量的视图文件:

    代码块是一种可以在模板中执行代码但是又不会返回仍和值给视图的方式,与代码段不同的是他不需要方绘制,视图会完全忽略代码块的返回值。

    布局

    Razor通过Layouts维护网站外观布局的一致性。使用布局,单个视图定义了整个网站的布局和样式,就像模板一样被其他视图使用。

    布局模板包含基本的标签,可以指定渲染视图内容的位置,网站中的每个视图可以引用这个布局,只包括内容,位置符合布局里约定的视图(译注6)。

    Razor的基本额布局文件(_Layout.cshtml)如下:

    布局机制 类似于asp.net web form 里的Master Page母版页机制,可以定义网站全局的布局样式,每个页面引用嵌套在这个全局的布局中。

     布局文件包含了html内容,它定义了整个网站的Html结构,依赖于一些变量和帮助函数来进行单个的视图交互,一旦Razor布局定义完成,视图引用当前布局以后就可以定义自己的段落内容。

    下面的视图页面引用了前面的布局文件

     Razor布局和内容视图像披萨一样组合在一起,每一块定义了页面的特定部分,当所有的小块组合在一起时,就可以展示出一个完整的页面。

    部分视图

    虽然布局通过重用部分Html代码提供了维护网站外观一致性的方法,但是某些场景还是无法处理的,这就需要一些特定的方法。

    最常见的场景就是在网站中的多个位置显示高级别的信息。例如可能要想使一个交易列表-支线会交易的名称 而且可能需要在网站的多个页面显示,入搜索页面,网站的主页。

    asp.net mvc 通过部分是视图可以支持这些场景。

    部分视图就是用来显示特定变迁代码的小时图,他们属于大视图的一部分,下面的代码演示了上面提到的加以列表的部分视图代码结构:

         为了以后使用这个部分视图,可以直接保存为一个单独的视图文件(例如,/view/shared/Auction.cshtml),然后用asp。net mvc自带的HTML帮助方法(这个方法可以吧部分视图作为另外一个视图的部分内容进行渲染)来调用它。

    下面的代码会在会在Auction集合里进行迭代,然后使用部分视图渲染每个交易信息:

     注意,html.Partial()帮助方法的第一个参数是一个视图的名字,并不包含扩展文件名后缀。这是因为Html.patial()帮助方法的基础是强大的Asp.net MVC视图引擎,渲染部分视图的方式与控制器中操作方法调用View()方法返回视图结果的过程十分类似,引擎使用视图名称去查找渲染特定的视图。

    同样,部分视图的查找和执行过程与View()方法的十分相似。唯一的区别就是部分视图表示的是大视图的一部分内容。

    与View方法一样帮助方法的第二个参数接受的是部分视图的模型,这个参数不是必须的,如果不指定,就使用调用HTML.Partial()的视图的模型,例如如果第二个参数没传递,则asp.net mvc会传递原来View视图的MODEL属性(IEnumerable<Auction>).

    上面的例子展示了如何重用部分视图以减少网站的重复代码以及复杂性,部分渲染十分有用,它也是唯一一种使用部分视图的方法,后面将介绍如何使用部分视图与Ajax进行交互。

    显示数据

    Mvc架构依赖于模型,视图和控制器,虽然彼此分离,但是确实同心协力工作在一起,这种关系中,控制器充当了"交警"的角色,协调系统的不同部分执行不同的应用处理逻辑,者写处理过程可能会返回一些特定的数据给用户,但是,显示数据的工作却不属于控制器,这是视图的职责,那么控制器如何与视图交互呢?

     asp。net mvc提供了两种方式在MVC边界之间床底数据,ViewData和Tempdata所以,从控制器向视图传递数据就变的非常简单,只需要在控制器里赋值即可,下面的代码来自HomeController.cs

     在试图文件中使用这个值,入About。cshtml

     通过ViewBag访问ViewData

    暴露viewdata属性的sdp。net mvc控制器和视图同样暴露了一个叫做ViewBag相似的属性。ViewBag只是把暴露ViewData简单包装成一个dynamic动态对象。

    例如,任何引用ViewData字典取值的代码都可以修改成使用ViewBag对象的属性的方式,入

     和

     dynamic类型是.net 4.0引入的新类型,与var不同的是,它不会再编译时检查类型,而是绕过编译时的类型检查,改为在运行时解析这些操作。

    除了基本的字典行为,ViewData对象也提供了Model属性,这是请求的原始模型对象。虽然Viewdata.model与viewdata【“model”】一样,但是他提升了模型对象的级别为一级,认为比其他数据更重要,

    例如,前两段代码里的CompanyName和Companydes关系密切,完全可以封装在一个模型对象里

    看一下

     HomeController中的ABODT操作代码如下;

     下面代码来自about。cshtml

     这段代码里,使用的CompanyName和companyDescription字典值都已经封装到一个名为companyinfo的新类中,HomeController的代码也在操作中使用了View()的重载方法,重载方法保留看了第一个参数视图名,第二个参数辨识要赋值给viewdata.model属性的对象。

    仙子,comopany对象直接作为模型参数传递给View方法,视图可以从company对象理货区他的值

    强类型视图

    在默认情况下,Model属性可以在Razor视图里访问,并且是动态类型,这意味着可以直接访问这个类型,而不需要知道他的准确类型,但是,考虑到c#语言的静态属性以及Visual studio对Razor视图强大的智能感知支持,最好还会明确页面具体类型。

    幸运的是,Razor让一切变得简单-直接使用@model就可以指定Model的类型:

     这个例子修改了之前的例子,省略了添加viewdata。Model装换的中间变量,相反,第一行使用了@model关键字告诉模型类型是companyinfo,这让所有Viewdatamodel引用变成强类型,而且可以知己访问。

    html和url帮助方法

    绝大部分web请求的目标都是向户发送HTML代码,正因为如此,asp.net mvc会尽力帮助你去创建html。除了Razor标记语言,ASP.net mvc 也提供了很多生成HTML代码的简单,有效的方式。最重要的两个帮助类就是HtmlHelper类和UrlHelper类,作为控制器和视图的html和url属性暴露出来,供大家使用。

    这里是一些帮助类的例子:

     渲染的Html代码如下

     一般而言,htmlhelper类和UrlHelper类并没有几个自己的方法,它们只是扩展了框架的一些附加行为,这使得它们成为重要的扩张点,

    尽管有太多的的方法无法一一例句,但是这里还是要强调一件事情:HtmlHelper类帮助我们生成Html标记代码,而UrlHelper帮助我们生成Url地址,记住,当需要生成Html或者URL的时候使用他们。

    前面已经学习了控制器和视图,下面介绍MVC架构中模型的概念。它被认为是MVC架构中最重要的部分,如果它真的如此重要,可为什么偏偏最后才介绍呢?

    因为模型层是最复杂的,它往往包含了整个程序的所有业务逻辑,而且每个长靴的业务逻辑千差万别。

    从技术角度来看,模型由属性暴露数据,方法封装业务逻辑的类组成,这些类大小各异,最长见的例子就是“数据模型”或者“域模型”,它们的首要职责就是负责管理数据。

    例如,下面的代码展示了Auction类--这个模型将会驱动整个EBuy网站:

     在本书中,我们会给类添加各种各样的功能和行为,比如验证等,这段代码完全可以标识“Auction”模型类。

    正如会在本书中逐步完善Auction类一样,还会使用其他的类,来编写MVC架构中的模型类。

    群英荟萃

    目前为止,已经介绍了asp.net mvc的所有组成部分,但仅仅是停留在Visual Studio使用项目模板创建的代码上,换句话说,实际上还没有做任何事情,所以,现在就行动起来。

    下面一段将关注与实现这样一个例子;显示一条交易信息,回顾一下,每个asp.net mvc请求都至少需要包含三样东西:路由,控制器和视图(模型并不是必须的)。

    要弄清楚你想要的为墨功能定义的路由模式,首先就要知道自己希望的那个功能URL的样子。这个例子里将会选择一个相对标准的URLAUCTIONS/details/Auction id 例如,http://www.ebuy.biz/Auctions/Details/1234.

    太神奇了--默认的路由已经支持这个URL了。

    控制器

    接下来就要创建包含处理请求的操作方法的控制器。

    因为控制器只是实现了控制器接口的类,所以也可以像文件夹添加继承了的心累,然后在新类中添加控制器操作代码。然而Vs提供的向导工具完成了大部分创建控制器的工作,仅仅需要用右键点击文件夹,然后选择就会弹出添加控制器的对话框,如图1-8所示。

    添加控制器的对话框首先会要求输入控制气的名字然后是选择使用那种模板,一次选择不同的选线就可以控制升恒洗呢控制器类

    控制器模板

    添加控制器的对话框提供了几种不同的控制器模板,可以帮助你提升开发速度。

    空Mvc控制器

    默认的模板(空mvc控制器)最简单,没有提供任何定制化的选项,因为他他简单的所以不包含任何选项仅仅是创建一个带有名字和伊尔index啊哦做的控制器类。

    包含读写操作的控制器和视图使用ef框架

    包含读写操作的控制器和视图使用ef框架,模板名副其实,这个模板和包含读写操作的mvc控制器模板有相同的输出,而且可以帮助我们生成访问ef对象的代码。跟贴心的是还以为这些对象生成了create,edit details和delete视图。

    如果你的项目使用了ef去访问数据库,那么使用这个模板无疑等于成功了一半,而且这些情况下生成的代码应该就是想要的支持增删查改的代码。

    包含空读写操作的Mvc控制器

    包含空读写操作的MVC控制器与空MVC控制器模板生成的额代码一样只是增加了一些暴露标准数据操作的方法;Details,create,edit,delete。

    web apl控制器模板最后的三个模板属于web api的部分内容将在第六章详细介绍

    值得注意的一个有趣现象就是控制器里的代码,vs生成的代码中,index 和detailes操作都只有一个·操作方法,而create,edit和delete却有两个重载方法,一个标记了Httppost属性,另外一个没有。

    这是因为create,edit,和delete需要两个请求来完成操作,第一个操作生成用户视图,地位个真正执行想到的操作(创建,编辑和删除),这种情况在Web程序中非常普遍,本书里会看到几个这种例子

    不幸的是,目前我们还没有见到使用Ef的内同,所以,可以像是用包含空读写操作的api控制器模板那选项,然后点击添加按钮生成新的控制器类。

    vs 创建auction从ntroller之后,找到Detaile操作,添加创建auction模型的代码,然后通过view方法传递给试图。

    是的这是一个比较次的例子。正常情况下需要从别处读取数据,比图数据库但是为了这个例子不得不饿使用硬编码如下:

     视图控制器操作代码编写好并且可以向视图提供数据了现在可以开始创建试图文件。

    和之前的控制器类一样也可以随便最强View文件你啊添加视图,但是,如果喜欢智能一点,vs也提供了专门创建视图的向导以及存放视图的文件夹。

    使用vs添加视图向导的过程非常简单,右键点击控制器的任何地方,选择“添加视图”选项,就会弹出添加视图的对话框,如图1-9所示,他添加

     

     添加视图的对话款搜先会要求输入新试图的名字,默认的名字是之前启动新试图action的名字,然后对护矿循序悬着编写代码是使用的语法,默认为创建web项目是使用的语法,但是也可以洗选择别的语法,因为哼课呢给游侠试图使用Razor语法,有写aspx使用web form语法。

    于添加控制器都对话框一样,剩下的选项就与vs胜场对啊吗的过程有关系了,例如,可以同于i从项目类列表中心选择类匿名或者自己姝蕊类名来生成如果你选择了强类型视图,想到会让你选择一个模板那更改模板会自动分析模型类型并生成对应的表单元素。

    这是一种非常棒的加速开发的方式,可以节约大量输入类型的时间,想在让我梦来体验一下请类型视图带来的巨大遍历在墨香类下拉列表框中选择acuction然后选择details模板。

    vs模型类下拉列表中只包含编译成功的类如果看不到之前创建的AUCTION  类,就先编译整个解决方案,然后重新打开添加视图对话框,最后还需要告诉vs这个视图是不是部分试图或者要不要应用布局试图,当使用aspx 微博form语法编写代码时选中创建不妨事贴图

    vs回味创建一个用户控件。ascx而不是完整的页面当使用Razor语法是,vs回味部分试图和王正页面创建相同的累心的文件,在Razor语法中此次复选框的唯一效果是获取在新试图生成的Htnl标记。

    这个Demo的摸底就是到苏大家,王权可以不使用默认设置,不要选中:创建部分试图,复选款而应该选中使用布局视图或模板那也,让布局文本框为空就行,如图1-10所示。

     

     配置完成以后,就可以让vs生成性的属兔了,王城后就会看到Vs分析完Auction‘之后生成了需要的H太猛啦、

    代码,这里应用了·HTML 版主方法如Html。displayr来香水所有对于成岩

    至此已经可以运行网站了,找到控制器擦欧总地址,看一下卢兰其渲染对策auction对象的详细内特容,如图1-11所示

    生成的界面虽然不漂亮但是vs生成Htnl代码能节约必要的开发时间一档生成好之后就可以随意修改代码了。

    恭喜,仙子啊已经王权从头开始创建一个新的控制器和操作方法啦

    到目前为止已经学习了所有创建asp,net 吗,vc程序所需要的知识,但是子啊学习新内容之前还有以哦个和更重要的概念不i炫耀知道吗,如何子啊永华放啊我呢控制器操作之前验证他猛的生风以保护王章的萘胺。也许已经注意到了,护粮网应用模板那胜场了王权事项了form验证方式,安全共和省份验证时每个wen应用程序必须面对的问题,

    有时候需要对默写页面惊醒省份验证,安全共和省份验证是美国web应用程序必须面对的问题,有时候需要对默写页面星星省份验证,有hi后系哟啊u对整个网站惊醒省份信仰正,有时候要对特定的用户惊醒相知以阻止未授权的用户访问王章秒既然绝大多数时候都需要安全机制为什么不从vs胜场控制器和操作代码时开始呢?

    传痛的asp。net王章添加省份验证的凡是就是在web。comfig中添加设置哦一行的时asp,netmvc不支持这种方式,asp.net mvc 程序依赖于控制器操作,而不是物理页面。

    相反,asp.net mvc 框架提供了authirattribute标记属性,他可以直接应用到每个控制器操作(或者所有的控制器)上,限制只有验证通过·的用户,特定的用户或者用户角色才可以访问

    下面创建的Usercontroller的Profile操作,它会显示当前用户的信息;

        显然,如果用户没有登陆,这个操作就会失败,如果使用了authorizeAtttrivbute编辑属性的操作,任何未验证通过的请求都会被拒绝;

     如果想指定具体哪些用户可以访问这些操作,Authorizeattribute也暴露leUSER属性,可以用来设置访问的白名单,用户名,当然也可以通过Role属性设置用户角色

    现在,当未验证的用户访问这些地址时,页面会重定向到登录URL:accountcontrollerLogin操作。

    账号控制器

    为了版主我们提升开发应用程序的效率,asp.net mvc 互联网模板包含了accountControoller。也包含了使用asp.net成员提供的操作方法。

    accountController提供了现成的功能,与视图一起支持每个操作,这意味着新建的asp.net mvc网站已经包含账号的所有相关功能,就不需要编写代码了:

    。登录;

    。退出;

    。祖册新用户;

    。修改代码。

    因此,当在每个操作上标记authorize时用户就会重定向到现有的登录页面,如图1-12所示。

     而且当用户创建新的额账户时,可以点击Login超链接,直接跳转到注册页面,如图1-13所示。此外如果不喜欢asp,net mvc提供的视图模板,name也可以自定义视图来瞒住的定需求。

    mvc 框架不仅可以轻易是想每个操作的验证功能,而且默认的项目模板也能实现用户验证需要的全部功能。

     mvc 不仅使用了久经考验的mvc架构模式,而且它还是一个全新,支持松耦合架构以及各种面向对象编程模式和实践准则的网站开发框架。

    asp。net mvc框架引入强大的项目模板,并支持惯例优先原则,避免了大量方所的工作,节约快乐开发时间,提升了万丈开发的效率。

    本章介绍了构建mvc应用程序需要的基本概念和技术,挤下来,本书会扩展这些基只是,并介绍更多asp.net mvc 框架的功能已帮助我们构建强壮的,以维护的web应用。还等什么,让你我们继续学习开发高性能web应用所需的所有知识吧!

  • 相关阅读:
    Java三大主流框架概述
    ASP.NET的内置对象
    9月29
    第一章
    在java开发中,为什么要使用单例模式。。?
    《设计模式之禅》一书学习心得(连载中)
    网上的一些java算法题的个人练习笔记
    第四次作业
    看《构建之法》有感
    实验四
  • 原文地址:https://www.cnblogs.com/555556J/p/13530181.html
Copyright © 2011-2022 走看看