ASPNet MVC开发基础学习笔记.docx
- 文档编号:4685721
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:14
- 大小:1.02MB
ASPNet MVC开发基础学习笔记.docx
《ASPNet MVC开发基础学习笔记.docx》由会员分享,可在线阅读,更多相关《ASPNet MVC开发基础学习笔记.docx(14页珍藏版)》请在冰点文库上搜索。
ASPNetMVC开发基础学习笔记
ASP.NetMVC开发基础学习笔记一
公司最新的产品改成MVC开发模式了,以前产品开发都是经典的三层架构。
对于“听闻”过而不有实际“品偿”过MVC的程序员来说,是知识的狭隘的表现。
于是乎最近在学习AMVC。
同时记录下自己的学习笔记,以便以后查阅使用。
可能有部分内容来自于网络或别人的博客,如有侵权,请联系,以便修改或进行说明。
一、三层架构与MVC
公司的产品既然是从三层架构转换为MVC,那么两者的区别究竟是什么?
这好像是一个讨论很久的问题!
什么是三层架构:
通常意义上的三层架构就是将整个业务应用划分为:
表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。
区分层次的目的即为了“高内聚,低耦合”的思想。
1、表现层(UI):
通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。
2、业务逻辑层(BLL):
UI层将数据抛砖给BLL层,BLL层负责对数据业务逻辑处理。
3、数据访问层(DAL):
接受BLL的数据,该层所做事务直接操作数据库,针对数据的增删改查等。
什么是ASP.NETMVC:
M即Model(模型层),主要负责出来业务逻辑以及数据库的交互
V即View(视图层),主要用于显示数据和提交数据
C即Controller(控制器),主要是用作捕获请求并控制请求转发
三层架构与MVC的联系与区别:
通过两者比较发现,三层架构没有Controller概念,这是两者最主要的区别了。
同时,两者里面都有一个Model层,虽然具有相同的名字,但是三层架构中Model的概念与MVC中Model的概念是不一样的,“三层”中典型的Model层是以实体类构成的,而MVC里,则是由业务逻辑与访问数据组成的。
他们相同的设计理念就是:
把视图设计与数据持久化进行分离,从而降低耦合性,易于扩展,提高团队开发效率。
他们的“区别”在于:
三层是基于业务逻辑来分的,而MVC是基于页面来分的
三层是种软件架构,通过接口实现编程,MVC模式是一种复合设计模式,一种解决方案
三层模式是体系结构模式,MVC是设计模式
三层模式又可归于部署模式,MVC可归于表示模式
注:
三层架构与MVC之间的关联是根据别人博客进行整理所得,以便加强自己的理解,如欲见详情请访问:
三层架构与MVC的区别
二、开始MVC之旅
新建一个MVC项目:
当点击确定后,弹出对话框,选择带红色框框的模板即可。
新建成功后,会发现解决方案下有许多文件夹,大致的文件及说明如下:
进行项目生成解决方案,开始执行(不调试)会发现解决我的第一个MVC项目竟然是这样的。
好神奇的感觉啊~,如下:
看不懂?
没有关系,这只是相关于微软提供的一个基本的Demo。
打开文件,会发现其是很简单的。
一看就懂。
当然,VS2012自带可以预览网页效果的工具--PageInspector。
就同Java用MyEclipse自带的功能一样,简单方便且功能还算强大。
平时做三层架构的项目时,调试一个页面时,我们经常要干的事就是输入网址,网址后缀名都会带一个index.aspx,而MVC的网站却好像打开一个文件的目录?
而没有具体到哪个页面一样,感觉是不是总觉得少了点什么?
MVC的工作模式其实是这样的:
有人觉得奇怪,为什么地址不是具体的页面(如index.aspx),但最后却显示的index页面的内容?
这个是因为URL被重写了!
.ASP.NET中叫做UrlRouting,对应的程序集是System.Web.Routing。
字面意思是路由,你懂的。
三、分析第一个Demo
我们来分析一下,我们用VS2012建项目时的第一个Demo【打开VS2012,按照上面方法新建一个项目,即会产生这些文件,实际开发中将会被删除】。
打开index.cshtml页面时,我们会发现如下代码【见黄色底纹部分】:
复制代码
1@{
2ViewBag.Title="主页";
3}
4@sectionfeatured{
5
6
7
8
@ViewBag.Title.
9
@ViewBag.Message
10
11
12若要了解有关ASP.NETMVC的详细信息,请访问
13
14该页提供视频、教程和示例以帮助你充分利用ASP.NETMVC。
15如果你对ASP.NETMVC有任何疑问,请访问
16
17
18
19
20}
复制代码
再来看看Controller里面的HomeController类和页面之间的关系,如下:
这点可以说明View是经过Controller的。
再来看看Global.asax页面和App_Start目录下的RouteConfig.cs。
程序开始时,调用了RouteConfig的RegisterRouters方法,此方法包含的内容如上,注意调用的MapRoute方法
1routes.MapRoute(
2name:
"Default",
3url:
"{controller}/{action}/{id}",
4defaults:
new{controller="Home",action="Index",id=UrlParameter.Optional}
5);
把上面的URL填充,会发现,URL为(id值为空):
"Home/Index/"
再看看我打开的网站URL:
,有没有发现十分相似的地方?
对喽!
在ASP.NETMVC默认的视图引擎(WebFormViewEngine)下,views是按如下路径访问的:
/Views/{Controller}/{Action}.aspx
So,MVC程序的运行整个流程就明朗起来:
ASP.NETMVC应用程序运行时,Application_Start()方法被调用,此方法又调用了RouteConfig类中的RegisterRoutes()方法,RegisterRoutes()方法创建了路由表。
如上面提及的代码,路由第一段URL映射到一个控制器名字,第二段URL映射到一个动作,第三段映射到一个参数叫Id.
路由映射以下这些参数:
controller=Home Home表示默认控制器
action=Index Index表示IndexAction
id="" ID表示Index()参数,如下代码,没参数,所以ID=""
当请求URLhttp:
//localhost/home/index/时,以下代码HomeController.Index()将会被执行:
1publicActionResultIndex()
2{
3ViewBag.Message="Hello,WhyShang,快速启动你的ASP.NETMVC应用程序。
";
4returnView();
6}
至此对AMVC4有一个基本的理解。
原理明白了,才能更好的学习。
明天的生活才会更美好!
ASP.NetMVC开发基础学习笔记:
二、HtmlHelper与扩展方法
一、一个功能强大的页面开发辅助类—HtmlHelper初步了解
1.1有失必有得
在ASP.NetMVC中微软并没有提供类似服务器端控件那种开发方式,毕竟微软的MVC就是传统的请求处理响应的回归。
所以抛弃之前的那种事件响应的模型,抛弃服务器端控件也理所当然。
但是,如果手写Html标签效率又比较低,可重用度比较低。
这时,我们该怎样来提高效率呢?
首先,经过上篇我们知道可以通过ViewData传递数据,于是我们可以写出以下的Html代码:
ViewData["UserName"]%>"/> 虽然以上代码可以解决问题,但是效率还是比较低,特别是在列表集合项较多的时候,工作量会比较大。 那么,还有木有一种更好的方式呢? 别急,微软已经为我们想好了策略。 微软为开发人员快速开发前台页面提供了丰富的HtmlHelper的辅助类,辅助我们快速开发前台页面,也提供了可扩展的接口,前台页面的标签可以可以做到高度可重用。 1.2HtmlHelper初窥 我们可以通过在页面中通过Html.XXX来实现快速的Html标签编辑,并且可以方便地进行数据绑定。 <%: Html.Raw(" Hello,IamHtmlHelper!
那么,为什么可以在页面中调用Html.XXX方法呢?
通过ILSpy反编译ViewPage页,我们可以看到原来在ViewPage下有一个HtmlHelper类型的属性-Html。
(这下终于知道,为什么可以在页面中使用Html.xxxx()了)
那么这个HtmlHelper类又是一个什么类型的大神呢?
继续反编译查看,在System.Web.Mvc命名空间下的HtmlHelper类型如下图所示,经过MSDN大神的讲解,HtmlHelper支持在视图中呈现HTML控件。
那我们看看在此类中有木有传说中的TextBox、CheckBox的方法呢?
经查看,木有。
那么,我们为什么可以在页面中使用Html.TextBox()方法呢?
这里就涉及到一个叫做“扩展方法”的东东了,HtmlHelper类的扩展方法在System.Web.Mvc.Html命名空间中。
这些扩展添加了用于创建窗体、呈现HTML控件、呈现分部视图、执行输入验证等功能的帮助器方法。
那么,有关如何自定义扩展方法请参阅本文第三部分,这里先卖个关子,暂不介绍。
1.4为什么使用HtmlHelper?
思考这样一个场景:
我们的项目第一个版本中的路由规则是这样的{controller}/{action}/{id},于是我们项目中所有的标签所指向的都是以刚刚的规则命名的href(例如:
但是在第二版中,我们的路由规则也会变成了{controller}-{action}-{id},那么我们刚刚为超链接所设置的href便都无法正常访问了。
这时,我们需要进行替换,单个替换或批量替换(例如改为:
那么,怎样来屏蔽这种变化所带来的不便呢?
这里,通过使用HtmlHelper为我们提供的ActionLink标签,便可以解决这个问题。
因为HtmlHelper是从服务器端自动帮你生成a标签,因此所生成的href会遵循目前的路由规则,也就帮我们屏蔽了变化,提高了工作效率。
二、没有服务器控件也能干大事—HtmlHelper重要方法介绍
PS:
这里的实例均没有加<%%>或@符号,要运行请自行加上。
(1)ActionLink与RouteLink
Html.ActionLink("这是一个连接","Index","Home")带有QueryString的写法Html.ActionLink("这是一个连接","Index","Home",new{page=1},null)Html.ActionLink("这是一个连接","Index",new{page=1})有其它Html属性的写法Html.ActionLink("这是一个连接","Index","Home",new{id="link1"})Html.ActionLink("这是一个连接","Index",null,new{id="link1"})QueryString与Html属性同时存在Html.ActionLink("这是一个连接","Index","Home",new{page=1},new{id="link1"})Html.ActionLink("这是一个连接","Index",new{page=1},new{id="link1"})
其生成的结果为:
page=1">这是一个连接 page=1">这是一个连接有其它Html属性的写法 Length=4"id="link1">这是一个连接 page=1"id="link1">这是一个连接 page=1"id="link1">这是一个连接 RouteLink在用法几乎与ActionLink一致,这里就不再介绍,详情请参与MSDN; (2)TextBox与TextArea ①TextBox Html.TextBox("input1")Html.TextBox("input2",Model.CategoryName,new{@style="width: 300px;"})Html.TextBox("input3",ViewData["Name"],new{@style="width: 300px;"})Html.TextBoxFor(a=>a.CategoryName,new{@style="width: 300px;"}) 其生成的结果为: 300px;"type="text"value="Beverages"/> 300px;"type="text"value=""/> 300px;"type="text"value="Electronic"/> ②TextArea Html.TextArea("input5",Model.CategoryName,3,9,null)Html.TextAreaFor(a=>a.CategoryName,3,3,null) 其生成的结果为: 这里可以看到,我们可以使用强类型来生成Html标签,例如: Html.TextBoxFor(a=>a.CategoryName,new{@style="width: 300px;"}),这里的CategoryName就是某个类型的属性。 (3)CheckBox Html.CheckBox("chk1",true)Html.CheckBox("chk1",new{@class="checkBox"})Html.CheckBoxFor(a=>a.IsVaild,new{@class="checkBox"}) 其生成的结果为: (4)DropDownList Html.DropDownList("ddl1",(SelectList)ViewData["Categories"],"--SelectOne--")Html.DropDownListFor(a=>a.CategoryName,(SelectList)ViewData["Categories"],"--SelectOne--",new{@class="dropdownlist"}) 其生成的结果为: (5)RadioButton 男<%: Html.RadioButton("Gender","1",true)%>女<%: Html.RadioButton("Gender","2",false)%> 其生成的代码为: 男 (6)Encode与Raw Encode会将内容进行编码话,因此,如果你的内容中含有Html标签的话那么会被解析成特殊字符,例如: <%: Html.Encode(" 哈哈 其生成的代码为: <p>哈哈</p> 这里主要是为了防止XSS攻击和恶意脚本,因此在MVC中,默认的<%: %>就实现了<%: Html.Encode()%>。 但是,某些时候如果我们需要输出Html或JavaScript内容的字符串,这时我们可以使用HtmlHelper为我们提供的其他方法。 例如我们要输出刚刚那句话,我们可以如下使用: <%: Html.Raw(" 哈哈 其生成的代码为: 哈哈 在HtmlHelper中还提供了许多的扩展方法供我们方便创建Html,比如: BeginForm、EndForm等。 关于其他的方法介绍,请自行搜索,这里不再一一赘述。 三、随时随地我也能扩展—HtmlHelper扩展方法简介 3.1扩展方法简介 借助MSDN的介绍: “扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 ”扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。 我们可以回到第一部分对HtmlHelper的扩展类-InputExtension类上,它是对于HtmlHelper的扩展,那么怎么鉴别它是HtmlHelper的扩展呢? 3.2扩展方法的三要素 (1)静态类 可以从上图看出,InputExtension首先是一个静态类; (2)静态方法 既然是静态类,那么其所有的方法必然都是静态方法,例如: publicstaticMvcHtmlStringCheckBox(); (3)this关键字 可以从方法名定义中看出,第一个参数都是thisHtmlHelperhtmlHelper,代表对HtmlHelper类的扩展; 3.3自定义扩展方法 (1)在Models文件夹下新建一个类,取名为: MyHtmlHelperExt (2)将MyHtmlHelperExt设置为static,并写入以下的一个静态方法: publicstaticHtmlStringMyExtHtmlLabel(thisHtmlHelperhelper,stringvalue){returnnewHtmlString(string.Format(" bold;'>Hello-{0}-End",value));} (
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ASPNet MVC开发基础学习笔记 MVC 开发 基础 学习 笔记