Web开发新体验:ASP.NET+3.5MVC+架构与实战学习总结.doc

上传人:仙人指路1688 文档编号:2385085 上传时间:2023-02-17 格式:DOC 页数:48 大小:1.23MB
返回 下载 相关 举报
Web开发新体验:ASP.NET+3.5MVC+架构与实战学习总结.doc_第1页
第1页 / 共48页
Web开发新体验:ASP.NET+3.5MVC+架构与实战学习总结.doc_第2页
第2页 / 共48页
Web开发新体验:ASP.NET+3.5MVC+架构与实战学习总结.doc_第3页
第3页 / 共48页
Web开发新体验:ASP.NET+3.5MVC+架构与实战学习总结.doc_第4页
第4页 / 共48页
Web开发新体验:ASP.NET+3.5MVC+架构与实战学习总结.doc_第5页
第5页 / 共48页
点击查看更多>>
资源描述

《Web开发新体验:ASP.NET+3.5MVC+架构与实战学习总结.doc》由会员分享,可在线阅读,更多相关《Web开发新体验:ASP.NET+3.5MVC+架构与实战学习总结.doc(48页珍藏版)》请在三一办公上搜索。

1、Web开发新体验:ASP.NET 3.5 MVC架构与实战电子书的网址(目前有第四、第十三章):第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篇

2、实战篇第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被映射到控制器文件夹:对于视图组建中的公用部分,可以创建一个名称为Sh

3、ared的文件夹,该目录不属于单个的控制器,而是属于所有的控制器,在此文件夹中可以存放母版页、css样式表等文件。配置httpmodules节点注册了该模块,程序就会使用 3.5 mvc框架,将页面的请求转换为url路由,并调用相关控制器中的相关方法,实现指定视图的输出。1.2 路由进阶路由解析分析在传统的应用程序中,每个请求的页面对应着文件系统中的一个文件,没有就会出错。这些页面事实上都被表示为一个类,而该类实现了IHttpHandler接口,每当一个页面请求时,就会调用该类中的processRequest()方法,执行processRequest()方法之后,就会将指定的内容返回到浏览器中

4、。在基于 3.5 mvc框架的网站中,每个被请求的页面被映射到相应的控制器中的相关方法,控制器负责将指定的内容返回到浏览器中。路由解析分析,主要说明路由解析的主要流程,也就是路由解析管道,实现路由解析的UrlRoutingModule类、IRouteHandler接口和IHttpHandler接口。UrlRoutingModule类是ASP.NET3.5 MVC 网站中处理程序的入口,每当用户在浏览器中键入一个URL地址,就发出一个用户请求,UrlRoutingModule类就响应用户的请求,处理用户的请求;检索RoutTable类中的RoutCollection集合,获得匹配的路由;通过路由

5、解析,得到Route类的实例化对象;将用户的请求分发到实现接口IRouteHandler的路由处理程序,并输入RequestContext参数;最后再次分发到实现接口IHttpHandler的MvcHandler处理程序,定位到相关的控制器,从而执行控制器中的相关动作方法,实现响应的输出。 UrlRoutingModule类主要实现路由的处理,如检索、匹配等解析过程。使用时在Web.Config中的配置: httpModulesUrlRoutingModule类在获得URL路由后,将用户的请求分发到实现接口 IRouteHandler的MvcRouteHandler类,并传入RequestCo

6、ntext参数。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/Ac

7、tion/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路由

8、通配符为了实现对一类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

9、匹配结果/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程序集的RouteC

10、ollectionExtemsion类中。优化路由设置 设置路由名称:在路由的设置中,路由名称是可选的输入参数,路由名称可以用来生成URL路由,但是在路由解析中没有什么作用。当开发者使用路由名称来生成url路由的时候,路由模块将快速定位到指定名称的路由。则不会通过查询的方式,一个接一个的查询。而是直接跳转到路由表中的对应路由名称的路由。 将常用的路由存放在路由表的最前面。该方法不仅提高生成url路由的效率,而且还提高路由解析的效率。这是因为在解析路由的过程中,一旦选找到匹配的路由,就停止路由解析。但需要说明的是,在改变路由的存放位置时,需要注意路由的次序改变是否实质性影响匹配。自定义路由约束1

11、.3 HtmlHelper概述在视图ViewPage类中,专门设置了一个html属性即为HtmlHelper类的类型。1.7 大、中型 3.5 mvc项目开发个性化目录 设置视图路径首先:View/home/Product文件夹然后: public ActionResult List() return View(“Product/List”);缺点:不便于项目的维护,控制器最好不需要知道视图的存储位置,以便实现控制器与视图之间良好的分离。MVC进阶学习-个性化目录结构(一) (一) 简单MVC目录结构分析以上是一个再简单不过的MVC目录结构了,这也是微软MVC解决方案的基础目录结构,在我们一般

12、的MVC开发项目中,基本上就是套用了这种格式。我们不需要去自己去定义一个目录,因为微软已经帮我们定义好了。我们只需要在原有的基础上添加和修改。Content 文件夹,内容文件夹,姑且这样理解,我们主要存放样式文件,图片文件,xml文件以及其他的一些资源文件。这个没有太多的介绍。当然我们不一定要放到这个 里面去,也可以自己定义一个文件夹。不过我个人还是趋向于放在这个里面,毕竟是别人已经定义好了的,拿来主义,直接用就可以了。Scripts 文件夹,则主要存放的是Javascript 的js文件,其中里面自带了Jquery的核心包和微软自带的Ajax相关的js文件。如果我们没有用到可以删除(我想你会

13、喜欢上它,舍不得将它删除)。 还有我们自己定义的一些js文件也可以存放在这个文件夹中。这样是为了使目录结构清楚,方便于文件的管理Views文件夹,在我们新建MVC项目的时候,这个文件夹下有三个文件夹,分别是Shared,Home,Account。其中 Home,Account存放的一些aspx页面。我想你一定会主要到得里面只有aspx页面而没有cs页面。这就是MVC与WebForm很大不同的地 方。Shared文件夹则是存放了母版页和用户控件等文件,当然它可以存放aspx页面,比如我们的错误页面。只要是我们想让他共享的页面文件都可以存放 在这个里面。这里的Home,Account 这两个文件夹

14、不是普通的文件夹(这是要注意的地方),因为它与控制器相关联。Controllers文件夹,这个文件夹这是存放 控制器类的文件夹,MVC的核心文件夹,一切控制请求转发都是这个里面的类文件来处理。Controller 主要作用是捕获请求和控制流程转发,其作用可想而知。我们主要到每个控制器都是以*Controller 来命名的,如果你第一眼能看出来说明你很聪明。这里的每个控制器都是与Views文件夹下的文件夹对应,Home文件夹则对应 HomeController 类,Home文件夹下的所有文件都可以由HomeController来处理。当然不是一定由它处理。要分清楚,Views文件夹下的文件夹就一

15、定对应一 个Controller,反之的理解是狭隘的(二)视图路径的设置当我们苦恼于如果页面文件很多的时候,1000个aspx页面我要放在一个文件下,这些文件怎么管理啊。呵呵MVC可以再新建视图路径,如上 图。我们可以再Home 文件夹中再建立一个文件夹,这儿里面同样可以存放aspx页面。既然可以新建文件夹,那么管理文件就方便多了访问方式: public ActionResult List()return View(Detail/StuDetail);使用这种方式就OK了 设置视图查询路径MVC进阶学习-个性化目录结构(二) (一) 浅谈MVC目录结构在上一篇(MVC进阶学习-个性化目录结构(

16、一)中了解到了MVC 的基本目录结构,以及各个目录的作用。我们只是说到了表面的目录结构,没有了解到它运行的原理。是不是MVC的目录结构只能有那种固定的模式呢,我们能否 根据自己的需要扩展这些目录结构呢。答案是肯定的。因为 MVC中引用了WebFromViewEngine 这个视图引擎(二) WebFormViewEngine视图引擎1.IView接口 IView接口是对MVC结构中View对象的抽象, 此接口只有一个方法:void Render(ViewContext viewContext, TextWriter writer); Render方法的作用就是展示View对象, 通常是将页面H

17、TML写入到Writer中供浏览器展示.2.IViewEngine接口 MVC中ViewEngine的抽象,该接口有两个方法:ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)该方法的作用就是寻找视图对象,值

18、得注意的是上面两个方法返回的都不是ViewPage 页面对象,而是ViewEngineResult 对象。我们可以将ViewEngineResult理解为一次查询的结果, 在ViewEngineResult对象中包含有本次找到的IView对象. 这句话我也不是太懂,看很多相关资料是这样写的,我也姑且这样写吧3.IViewEngine 的实现类IViewEngine有两个实现类。WebFormViewEngine :VirtualPathProviderViewEngine:IViewEngine 这个是它们的关系。而MVC中的试图引擎就是使用的WebFormViewEngine。 WebFor

19、mViewEngine包括了三个属性:MasterLocationFormats 可以个性化母版页的路径ViewLocationFormats 可以个性化试图页面的路径PartialViewLocationFormats 可以个性化用户控件的路径4.在Global.asax 中注册个性化路径1protectedvoidApplication_Start()23ViewEngines.Engines.Clear();45ViewEngines.Engines.Add(newWebFormViewEngine()67ViewLocationFormats=newstring8/0.aspx,9/0

20、.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文件夹,这些文 件夹都是存放控制器类的。我们可以根据自己的需要建立不同的Controlle

21、r 组。在大型项目开发的过程中,模块的数量可能会很多,仅仅只靠原有的目录结构是不能满足我们的要求的,而且扩展性也不是太好,因为思想就被束缚在它 本身的结构上,扩展谈何容易。但真正的作为一个企业级架构这肯定是不行的,最起码走起来比较困难。于是控制器组,个性化的目录就是解决方案的开始。(二) 扩展路由配置(RouteCollection 类的扩展)我们都知道 .net3.0 3.5 中出现的扩展方法使.net 出现了新的生机,我们不必在为系统方法的不适用而烦恼,也不用为其思维的束缚的叫苦不迭。扩展方法能使我们能够扩展系统中的任何一个类,给它重新添加自己想要的方法。Code1publicclassS

22、tudent23privateint_id;45publicintId67getreturn_id;8set_id=value;91011privatestring_name;1213publicstringName1415getreturn_name;16set_name=value;1718我定义一个实体类,这个类中只有两个属相,没有任何自定方法。现在我们用扩展方法给Student添加一个Write()自定义方法1publicstaticclassStudentExtension23publicstaticvoidWrite(thisStudentstu,stringname)45Cons

23、ole.WriteLine(name);67扩展方法的使用代码:Code1publicclassTest23publicvoidShow()45Studentstu=newStudent();6stu.Id=1;7stu.Name=ddd;8stu.Write(stu.Name);910注意 扩展方法必须在静态类中,而且扩展方法也必须用static修饰。扩展方法的第一个参数用this修饰,参考上面的就可以知道,当我们使用这个扩展方法的时候 参数就static 修饰方法中的非this修饰的参数,说的有点绕口。相信能够明白。RouteCollection扩展类,扩展路由设置1publicstati

24、cclassAreaRouteHelper23publicstaticvoidCreateArea(thisRouteCollectionroutes,4stringareaName,5stringcontrollerNameSpace,6paramsRouterouteEntries)78foreach(RouterouteinrouteEntries)910if(route.Constraints=null)1112route.Constraints=newRouteValueDictionary();131415if(route.Defaults=null)1617route.Defau

25、lts=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(rout

26、e);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/Vie

27、ws/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(Controller

28、ContextcontrollerContext,stringpartialViewName,booluseCache)3637ViewEngineResultviewResult=null;38if(controllerContext.RequestContext.RouteData.Values.ContainsKey(area)3940stringareaPartialName=FormatViewName(controllerContext,partialViewName);41viewResult=base.FindPartialView(controllerContext,area

29、PartialName,useCache);42if(viewResult!=null&viewResult.View!=null)4344returnviewResult;454647stringsharedAreaPartialName=FormatPartialViewName(controllerContext,partialViewName);48viewResult=base.FindPartialView(controllerContext,sharedAreaPartialName,useCache);49if(viewResult!=null&viewResult.View!

30、=null)5051returnviewResult;525354returnbase.FindPartialView(controllerContext,partialViewName,useCache);555657/58/匹配页面文件的,寻找相应的试图文件59/60/61/62/63/64/65publicoverrideViewEngineResultFindView(ControllerContextcontrollerContext,stringviewName,stringmasterName,booluseCache)6667ViewEngineResultviewResult

31、=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;757677

32、stringsharedAreaPartialName=FormatPartialViewName(controllerContext,viewName);78viewResult=base.FindView(controllerContext,sharedAreaPartialName,masterName,useCache);79if(viewResult!=null&viewResult.View!=null)8081returnviewResult;828384returnbase.FindView(controllerContext,viewName,masterName,useCa

33、che);858687/88/这个匹配一般的页面文件或用户控件路径89/90/91/92/93publicstringFormatViewName(ControllerContextcontext,stringviewName)9495/根据路由的参数值获得控制器的名称96stringcontrollerName=context.RouteData.GetRequiredString(controller);9798/根据路由的参数获得控制器组的名称99stringarea=context.RequestContext.RouteData.Valuesarea.ToString();100re

34、turnArea/+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 protecte

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号