




已阅读5页,还剩43页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
web开发新体验:asp.net 3.5 mvc架构与实战电子书的网址(目前有第四、第十三章):/art/200909/151515.htm第1篇 体验篇第1章 初识 3.5 mvc开发第2章 路由进阶第3章 htmlhelper控件解析第4章 自定义gridview控件开发第5章 自定义视图引擎第6章 图表开发第7章 大、中型 3.5 mvc项目开发第8章 过滤器解析、开发第9章 控制器与视图之间的数据传递第10章 jquery视图开发第11章 多项目混合开发第12章 单元测试第13章 网站部署第2篇 架 构 篇第14章 初识联系人管理网站第15章 联系人管理网站初探第16章 联系人管理网站进阶第17章 联系人管理网站高级实现第3篇 实战篇第18章 博客网站初探第19章 多层架构的博客网站第20章 博客网站页面总体设计第22章 博客网站管理页面第23章 博客网站安全1 体验篇1.1 初识asp.net 3.5 mvc开发asp.net 3.5 mvc的特点1) 易于调试2) 易于实施测试驱动开发3) 可扩展、可替换如视图引擎、url路由策略4) 支持web forms的相关性在视图模板中支持当前的web forms页面(.aspx)、用户控件(.ascx)及母版页(.master)等还支持嵌套母版也、内联表达式、数据绑定、本地化、数据缓存等。5) url被映射到控制器文件夹:对于视图组建中的公用部分,可以创建一个名称为shared的文件夹,该目录不属于单个的控制器,而是属于所有的控制器,在此文件夹中可以存放母版页、css样式表等文件。配置httpmodules节点注册了该模块,程序就会使用 3.5 mvc框架,将页面的请求转换为url路由,并调用相关控制器中的相关方法,实现指定视图的输出。1.2 路由进阶路由解析分析在传统的应用程序中,每个请求的页面对应着文件系统中的一个文件,没有就会出错。这些页面事实上都被表示为一个类,而该类实现了ihttphandler接口,每当一个页面请求时,就会调用该类中的processrequest()方法,执行processrequest()方法之后,就会将指定的内容返回到浏览器中。在基于 3.5 mvc框架的网站中,每个被请求的页面被映射到相应的控制器中的相关方法,控制器负责将指定的内容返回到浏览器中。路由解析分析,主要说明路由解析的主要流程,也就是路由解析管道,实现路由解析的urlroutingmodule类、iroutehandler接口和ihttphandler接口。urlroutingmodule类是asp.net3.5 mvc 网站中处理程序的入口,每当用户在浏览器中键入一个url地址,就发出一个用户请求,urlroutingmodule类就响应用户的请求,处理用户的请求;检索routtable类中的routcollection集合,获得匹配的路由;通过路由解析,得到route类的实例化对象;将用户的请求分发到实现接口iroutehandler的路由处理程序,并输入requestcontext参数;最后再次分发到实现接口ihttphandler的mvchandler处理程序,定位到相关的控制器,从而执行控制器中的相关动作方法,实现响应的输出。 urlroutingmodule类主要实现路由的处理,如检索、匹配等解析过程。使用时在web.config中的配置: httpmodulesurlroutingmodule类在获得url路由后,将用户的请求分发到实现接口 iroutehandler的mvcroutehandler类,并传入requestcontext参数。url路由 定义url路由将用户请求的url路由解析为一系列的离散值,该url路由通过占位符定义url的模式。在url路由中,通过大括号()定义占位符,这些占位符就是url路由参数,而字符串中的“/”、“.”等符号则作为分隔符被url路由解析这些离散的数据,对于不在小括号或者方括号中的信息则被视为一个常量。有效的url路由定义匹配的url例子controller/action/id/products/show/beveragestable/details.aspx/products/ details.aspx products:表名 details.aspx为常量blog/action/entry/ blog(常量) /show(相关控制器重的方法)/123(一个entry变量)reporttype/year/month/day/sales(reporttype变量)/2008(year变量)/1(month变量)/5(day变量) 设定url路由参数的默认值 routes.maproute( default, / route name controller/action/id, / url with parameters new controller = home, action = index, id = / parameter defaults 设定url路由通配符为了实现对一类url路由的定义,可以使用星号来定义url路由通配符。假定url路由通配符为:query/queryname/*queryvalues,则url通配符参数值/query/select/bikes/onsalebikes/onsale/query/select/bikesbikes/query/select空白字符串 添加url路由参数的约束constraints=new routevaluedictionarylocale,a-z2-a-z2,year,d4;locale必须为英文字母,前面2位英文字母必须小写的,后面2位英文字母必须大写的。而year必须是4位数字。url匹配结果/en-us/2008不匹配/en-us/08不匹配/en-us/2008locale=”en-us”,year=”2008”routing的扩展方法扩展方法的由来:路由程序集(system.web.routing)是在2008年8月11日更新 的.net 3.5框架sp1版本中发布的,而asp.net 3.5 mvc 1.0版本是在2009年3月18日才正式发布。在asp.net mvc版本的不断改进中,微软的开发团队感觉到以往的路由设置给开发者带来不便,但是路由的程序集已经发布,如何在路由程序集中添加新的功能呢?所以将扩展方法加在了 system.web.mvc程序集的routecollectionextemsion类中。优化路由设置 设置路由名称:在路由的设置中,路由名称是可选的输入参数,路由名称可以用来生成url路由,但是在路由解析中没有什么作用。当开发者使用路由名称来生成url路由的时候,路由模块将快速定位到指定名称的路由。则不会通过查询的方式,一个接一个的查询。而是直接跳转到路由表中的对应路由名称的路由。 将常用的路由存放在路由表的最前面。该方法不仅提高生成url路由的效率,而且还提高路由解析的效率。这是因为在解析路由的过程中,一旦选找到匹配的路由,就停止路由解析。但需要说明的是,在改变路由的存放位置时,需要注意路由的次序改变是否实质性影响匹配。自定义路由约束1.3 htmlhelper概述在视图viewpage类中,专门设置了一个html属性即为htmlhelper类的类型。1.7 大、中型 3.5 mvc项目开发个性化目录 设置视图路径首先:view/home/product文件夹然后: public actionresult list() return view(“product/list”);缺点:不便于项目的维护,控制器最好不需要知道视图的存储位置,以便实现控制器与视图之间良好的分离。mvc进阶学习-个性化目录结构(一) (一) 简单mvc目录结构分析以上是一个再简单不过的mvc目录结构了,这也是微软mvc解决方案的基础目录结构,在我们一般的mvc开发项目中,基本上就是套用了这种格式。我们不需要去自己去定义一个目录,因为微软已经帮我们定义好了。我们只需要在原有的基础上添加和修改。content 文件夹,内容文件夹,姑且这样理解,我们主要存放样式文件,图片文件,xml文件以及其他的一些资源文件。这个没有太多的介绍。当然我们不一定要放到这个 里面去,也可以自己定义一个文件夹。不过我个人还是趋向于放在这个里面,毕竟是别人已经定义好了的,拿来主义,直接用就可以了。scripts 文件夹,则主要存放的是javascript 的js文件,其中里面自带了jquery的核心包和微软自带的ajax相关的js文件。如果我们没有用到可以删除(我想你会喜欢上它,舍不得将它删除)。 还有我们自己定义的一些js文件也可以存放在这个文件夹中。这样是为了使目录结构清楚,方便于文件的管理views文件夹,在我们新建mvc项目的时候,这个文件夹下有三个文件夹,分别是shared,home,account。其中 home,account存放的一些aspx页面。我想你一定会主要到得里面只有aspx页面而没有cs页面。这就是mvc与webform很大不同的地 方。shared文件夹则是存放了母版页和用户控件等文件,当然它可以存放aspx页面,比如我们的错误页面。只要是我们想让他共享的页面文件都可以存放 在这个里面。这里的home,account 这两个文件夹不是普通的文件夹(这是要注意的地方),因为它与控制器相关联。controllers文件夹,这个文件夹这是存放 控制器类的文件夹,mvc的核心文件夹,一切控制请求转发都是这个里面的类文件来处理。controller 主要作用是捕获请求和控制流程转发,其作用可想而知。我们主要到每个控制器都是以*controller 来命名的,如果你第一眼能看出来说明你很聪明。这里的每个控制器都是与views文件夹下的文件夹对应,home文件夹则对应 homecontroller 类,home文件夹下的所有文件都可以由homecontroller来处理。当然不是一定由它处理。要分清楚,views文件夹下的文件夹就一定对应一 个controller,反之的理解是狭隘的(二)视图路径的设置当我们苦恼于如果页面文件很多的时候,1000个aspx页面我要放在一个文件下,这些文件怎么管理啊。呵呵mvc可以再新建视图路径,如上 图。我们可以再home 文件夹中再建立一个文件夹,这儿里面同样可以存放aspx页面。既然可以新建文件夹,那么管理文件就方便多了访问方式: public actionresult list()return view(detail/studetail);使用这种方式就ok了 设置视图查询路径mvc进阶学习-个性化目录结构(二) (一) 浅谈mvc目录结构在上一篇(mvc进阶学习-个性化目录结构(一)中了解到了mvc 的基本目录结构,以及各个目录的作用。我们只是说到了表面的目录结构,没有了解到它运行的原理。是不是mvc的目录结构只能有那种固定的模式呢,我们能否 根据自己的需要扩展这些目录结构呢。答案是肯定的。因为 mvc中引用了webfromviewengine 这个视图引擎(二) webformviewengine视图引擎1.iview接口 iview接口是对mvc结构中view对象的抽象, 此接口只有一个方法:void render(viewcontext viewcontext, textwriter writer); render方法的作用就是展示view对象, 通常是将页面html写入到writer中供浏览器展示.2.iviewengine接口 mvc中viewengine的抽象,该接口有两个方法:viewengineresult findpartialview(controllercontext controllercontext, string partialviewname, bool usecache)viewengineresult findview(controllercontext controllercontext, string viewname, string mastername, bool usecache)该方法的作用就是寻找视图对象,值得注意的是上面两个方法返回的都不是viewpage 页面对象,而是viewengineresult 对象。我们可以将viewengineresult理解为一次查询的结果, 在viewengineresult对象中包含有本次找到的iview对象. 这句话我也不是太懂,看很多相关资料是这样写的,我也姑且这样写吧3.iviewengine 的实现类iviewengine有两个实现类。webformviewengine :virtualpathproviderviewengine:iviewengine 这个是它们的关系。而mvc中的试图引擎就是使用的webformviewengine。 webformviewengine包括了三个属性:masterlocationformats 可以个性化母版页的路径viewlocationformats 可以个性化试图页面的路径partialviewlocationformats 可以个性化用户控件的路径4.在global.asax 中注册个性化路径code1protectedvoidapplication_start()23viewengines.engines.clear();45viewengines.engines.add(newwebformviewengine()67viewlocationformats=newstring8/0.aspx,9/0.ascx,10/views/1/0.aspx,11/views/1/0.ascx,12/views/shared/0.aspx,13/views/shared/0.ascx1415);16 控件器分组开发mvc进阶学习-个性化目录结构(三) (一) 目录结构看到上面的目录结构 会有耳目一新的感觉,终于突破了原有的mvc目录结构。该目录结构除了使用原有的controllers 文件夹之外,我们还使用了games自定义文件夹中的controllers。在users文件夹中也同样还有一个controllers文件夹,这些文 件夹都是存放控制器类的。我们可以根据自己的需要建立不同的controller 组。在大型项目开发的过程中,模块的数量可能会很多,仅仅只靠原有的目录结构是不能满足我们的要求的,而且扩展性也不是太好,因为思想就被束缚在它 本身的结构上,扩展谈何容易。但真正的作为一个企业级架构这肯定是不行的,最起码走起来比较困难。于是控制器组,个性化的目录就是解决方案的开始。(二) 扩展路由配置(routecollection 类的扩展)我们都知道 .net3.0 3.5 中出现的扩展方法使.net 出现了新的生机,我们不必在为系统方法的不适用而烦恼,也不用为其思维的束缚的叫苦不迭。扩展方法能使我们能够扩展系统中的任何一个类,给它重新添加自己想要的方法。code1publicclassstudent23privateint_id;45publicintid67getreturn_id;8set_id=value;91011privatestring_name;1213publicstringname1415getreturn_name;16set_name=value;1718我定义一个实体类,这个类中只有两个属相,没有任何自定方法。现在我们用扩展方法给student添加一个write()自定义方法1publicstaticclassstudentextension23publicstaticvoidwrite(thisstudentstu,stringname)45console.writeline(name);67扩展方法的使用代码:code1publicclasstest23publicvoidshow()45studentstu=newstudent();6stu.id=1;7stu.name=ddd;8stu.write(stu.name);910注意 扩展方法必须在静态类中,而且扩展方法也必须用static修饰。扩展方法的第一个参数用this修饰,参考上面的就可以知道,当我们使用这个扩展方法的时候 参数就static 修饰方法中的非this修饰的参数,说的有点绕口。相信能够明白。routecollection扩展类,扩展路由设置1publicstaticclassarearoutehelper23publicstaticvoidcreatearea(thisroutecollectionroutes,4stringareaname,5stringcontrollernamespace,6paramsrouterouteentries)78foreach(routerouteinrouteentries)910if(route.constraints=null)1112route.constraints=newroutevaluedictionary();131415if(route.defaults=null)1617route.defaults=newroutevaluedictionary();181920if(route.datatokens=null)2122route.datatokens=newroutevaluedictionary();232425route.constraints.add(area,areaname);26route.defaults.add(area,areaname);27route.datatokens.add(namespaces,newstringcontrollernamespace);2829if(!routes.contains(route)3031routes.add(route);32333435对于自定义视图的关键还是如下:webformviewengine 定义了视图文件的显示,我们可以继承改类从而重载覆盖父类的方法达到自己定义文件映射路径的目的1publicclassareaviewengine:webformviewengine23publicareaviewengine()4:base()56/定义页面文件或者用户控件文件的路径规则7viewlocationformats=newstring8/0.aspx,9/0.ascx,10/views/1/0.aspx,11/views/1/0.ascx,12/views/shared/0.aspx,13/views/shared/0.ascx14;1516/第一母版页文件路径规则17masterlocationformats=newstring18/0.master,19/shared/0.master,20/views/shared/0.master,21/views1/0.master22;2324partialviewlocationformats=viewlocationformats;25262728/29/匹配页面文件的,寻找相应的部分视图文件30/31/32/33/34/35publicoverrideviewengineresultfindpartialview(controllercontextcontrollercontext,stringpartialviewname,boolusecache)3637viewengineresultviewresult=null;38if(controllercontext.requestcontext.routedata.values.containskey(area)3940stringareapartialname=formatviewname(controllercontext,partialviewname);41viewresult=base.findpartialview(controllercontext,areapartialname,usecache);42if(viewresult!=null&viewresult.view!=null)4344returnviewresult;454647stringsharedareapartialname=formatpartialviewname(controllercontext,partialviewname);48viewresult=base.findpartialview(controllercontext,sharedareapartialname,usecache);49if(viewresult!=null&viewresult.view!=null)5051returnviewresult;525354returnbase.findpartialview(controllercontext,partialviewname,usecache);555657/58/匹配页面文件的,寻找相应的试图文件59/60/61/62/63/64/65publicoverrideviewengineresultfindview(controllercontextcontrollercontext,stringviewname,stringmastername,boolusecache)6667viewengineresultviewresult=null;68if(controllercontext.requestcontext.routedata.values.containskey(area)6970stringareapartialname=formatviewname(controllercontext,viewname);71viewresult=base.findview(controllercontext,areapartialname,mastername,usecache);72if(viewresult!=null&viewresult.view!=null)7374returnviewresult;757677stringsharedareapartialname=formatpartialviewname(controllercontext,viewname);78viewresult=base.findview(controllercontext,sharedareapartialname,mastername,usecache);79if(viewresult!=null&viewresult.view!=null)8081returnviewresult;828384returnbase.findview(controllercontext,viewname,mastername,usecache);858687/88/这个匹配一般的页面文件或用户控件路径89/90/91/92/93publicstringformatviewname(controllercontextcontext,stringviewname)9495/根据路由的参数值获得控制器的名称96stringcontrollername=context.routedata.getrequiredstring(controller);9798/根据路由的参数获得控制器组的名称99stringarea=context.requestcontext.routedata.valuesarea.tostring();100returnarea/+area+/views/+controllername+/+viewname;101102103/104/这个一般匹配母版页的文件路径105/106/107/108/109publicstringformatpartialviewname(controllercontextcontext,stringviewname)110111/根据路由的参数获得控制器组的名称112stringarea=context.requestcontext.routedata.valuesarea.tostring();113returnarea/+area+/views/shared/+viewname;114115116全局应用程序类配置:public class mvcapplication : system.web.httpapplication protected void application_start() viewengines.engines.clear(); viewengines.engines.add(new areaviewengine(); registerroutes(routetable.routes); /注册新的个性化视图引擎areaviewengine public static void registerroutes(routecollection routes) routes.ignoreroute(resource.axd/*pathinfo); / routing config for the blogs area routes.createarea(blogs, areasdemo.areas.blogs.controllers, routes.maproute(null, blogs/controller/action, new controller = home, action = index ) ); / routing config for the forums area routes.createarea(forums, areasdemo.areas.forums.controllers, routes.maproute(null, forums/controller/action, new controller = home, action = index ) ); / routing config for the root area routes.createarea(root, areasdemo.controllers, routes.maproute(null, controller/action, new controller = home, action = index ) ); /创建不同的控件组 1.8 过滤器解析、开发在amvc中当你有以下及类似以下需求时你可以使用filter功能1. 判断登录与否或用户权限2. 决策输出缓存 3. 防盗链 4. 防蜘蛛 5. 本地化与国际化设置6. 实现动态actionfilter是一种声明式编程方式,在a mvc中它只能限制于action(或它的controller)。 filter要继承于actionfilterattribute抽象类,并可以覆写void onactionexecuting(actionexecutingcontext)和 void onactionexecuted(actionexecutedcontext)以及void onresultexecuting(resultexecutingcontext)和 void onresultexecuted(resultexecutedcontext)onactionexecuting是action执行前的操作,onactionexecuted则是action执行后的操作而onresultexecuting是解析actionresult前执行,onresultexecuted是解析actionresult后执行。一、应用于action的filter下面我给大家一个示例,来看看它的的执行顺序 首先我们先建立 一个filter,名字叫做testfilter public class testfilter : actionfilterattribute public override void onactionexecuting(actionexecutingcontext filtercontext) filtercontext.httpcontext.sessiontemp += testfilter onactionexecuting; public override void onactionexecuted(actionexecutedcontext filtercontext) filtercontext.httpcontext.sessiontemp += testfilter onactionexecuted; public override void onresultexecuting(resultexecutingcontext filtercontext) filtercontext.httpcontext.sessiontemp += testfilter onresultexecuting; public override void onresultexecuted(resultexecutedcontext filtercontext) filtercontext.httpcontext.sessiontemp += testfilter onresultexecuted; 然后建立一个action: testfilter/将此filter应用于action public actionresult filteraction() return view(); 在它的view中写入:%sessiontemp += view execute; %最后在其它页面得到sessiont
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025广东广州医科大学附属医院第一次招聘163人考前自测高频考点模拟试题有完整答案详解
- 2025江苏南京地铁集团有限公司校园招聘(三)考前自测高频考点模拟试题附答案详解(考试直接用)
- 2025北京师范大学一带一路学院教学助理招聘考前自测高频考点模拟试题及答案详解(必刷)
- 2025年宣城市中心医院第一批次招聘22人考前自测高频考点模拟试题附答案详解
- 2025内蒙古选聘自治区特邀行政执法社会监督员考前自测高频考点模拟试题及完整答案详解一套
- 2025年4月四川内江市东兴区城镇公益性岗位招聘19人考前自测高频考点模拟试题附答案详解(黄金题型)
- 2025甘肃甘南玛曲县警务辅助人员招聘20人考前自测高频考点模拟试题及答案详解(必刷)
- 2025福建龙岩市上杭县文化旅游发展有限公司(上杭古田建设发展有限公司)所属企业招聘拟聘用人选(二)考前自测高频考点模拟试题含答案详解
- 2025年湖南长沙市开福区公开招聘教师140人模拟试卷及答案详解1套
- 2025北京市公园管理中心所属事业单位招聘94人模拟试卷及答案详解1套
- 2025年河北唐山市芦台经济开发区公开招聘区属国有企业工作人员18人笔试模拟试题及答案解析
- 2024年新高考Ⅰ卷英语真题(原卷+答案)
- 2025山东东营公安招录辅警392人考试参考试题及答案解析
- 2025四川宜宾市退役军人事务局招聘临聘人员2人考试参考题库及答案解析
- 高考语文 热点04 现代文阅读II之理论与文本互证类题(解析版)
- 预制混凝土检查井采购合同模板
- 外贸会计自学课件
- 2025年中小学《国庆节、中秋节》放假通知及安全提示
- 致敬 9.3:一场阅兵一部民族精神史诗
- (完整版)室外散水专项方案
- 智能物流行业智能化运输装备应用前景研究报告
评论
0/150
提交评论