Asp学习体会.docx
- 文档编号:11453463
- 上传时间:2023-03-01
- 格式:DOCX
- 页数:12
- 大小:22.72KB
Asp学习体会.docx
《Asp学习体会.docx》由会员分享,可在线阅读,更多相关《Asp学习体会.docx(12页珍藏版)》请在冰豆网上搜索。
Asp学习体会
A
学
习
体
会
C#是最近接触比较多的一种面向对象的语言,通过课本和视频熟悉了一下面向对象的知识,加上之前自考时对C的学习对面向对象有了进一步的了解。
尤其是在最后的时候,涉及到面向对象思想的一个小综合应用设计,还用到了一点设计模式的知识。
觉得在这方面还有欠缺。
主要是觉得在一些技巧的应用上很欠缺,主要是各种接口以及抽象类、多重继承的运用上,觉得缺少锻炼。
在新的知识上主要是asp.ent控件的学习。
针对这部分,只是尽量的去实现了一些控件的演示。
又不少控件觉得挺有用,但是没有逐个的去实现。
针对一些控件在听视频的时候都做了一些笔记,下一步的工作就是针对这些控件分门别类,按照功能做一个总结。
具体的控件的使用还需要在日后真正的实战中去锻炼,否则认识是不会深刻的,在这个阶段的学习也就是蜻蜓点水,知道有这么一个东西,在编程的时候知道大概实现的思路。
还有一部分就是ado的一些知识。
这部分相对比较简单,设计到程序跟数据打交道的一些功能。
我在做机房收费系统的时候用的都是实体类以及实体类的集合,刚好弥补了一些在Table、View、Adapter、DataSet等方面的欠缺。
一、何时使用Helper
其实使用Helper性能不是太高,能免即免,不过可以在以下场合使用
1.存在Url的地方
比如超级连接,Form的Action,图片的Src.因为开发者的UrlRouting可能变化,如果写死,改动成本较大
2.有表单,并且是修改信息的时候
因为<%=ViewData["字段"]%>本身切换显示也很费时,所以不如直接用Html来绑定输出
3.表单中的动太信息DropDownList
因为HtmlHelper已经提供了很好的方法,所以在填充它时还是尽量使用HtmlHelper
对于一般插入型的表单,直接HTML我觉得就比较好了
二、使用Helper时要注意的问题
1.尽量不要使用RenderAction
RenderAction相当于再执行了一个Action
它的效率选没有Html.RenderPartial好,且无法使用事务,在数据库操作时很是不爽
不过它的使用也算简单,在不要求页面效率时可以使用
2.关于Microsoft.Web.Mvc
在这个程序集中的类都是预计发布的测试版,性能尚不稳定,而且更改的可能性要高很多,所以最好就是尝一下鲜,不推荐使用。
三、ASP.NET页面的处理顺序
ASP.NET页面是由事件来驱动的,首先执行的是Init事件,在代码中,系统自动增加了一个OnInit的重载函数,从而在页面Init的时候就执行这个OnInit函数。
在这个函数中,会执行InitializeComponent函数,这个函数里就有很多控件事件的代理函数,展开一个页面的"WebFormDesignerGeneratedCode",我们就可以看见这些。
页面在执行完Init之后,就是Load事件,对应的代码就是Page_Load。
然后就是引起页面返回的事件的代码,当然,如果页面是第一次运行的话,就没有这一步了。
也就是说,页面每次刷新的时候都会执行Page_Load函数,这也就是为什么有些代码要写在
if(!
Page.IsPostBack)
{...}
中的原因。
比如有一个文本框,如果在Page_Load中设置初始值,放在哪儿呢?
如果放在if外面,那每次刷新的时候都会执行这个赋值语句,即使在页面中修改了文本框的值,在返回之后仍然会消失,但是如果放在if之中,那就可以了,返回之后文本框中仍然是先前的值。
四、JavaScript在页面中的应用
虽然ASP.NET采用新的运行机制,但是最后生成的还是能被一般浏览器识别的HTML和JavaScript代码。
在页面中,仍然可以通过Response.Write来写出一段JS代码,比如要弹出一个新的浏览器窗口,可以用Response.Write(@"
在Web控件中,Attributes属性集合也和JS联系紧密。
新增加的一个Attributes元素就对应Web控件最后生成的HTML代码的一个属性或者事件。
另外还有一个应用,如果有一个Button,它的Click事件中有很多对数据库的一些操作,我们要求用户在按了这个Button之后确认一次(这有点想ASP中的MsgBox),现在我们就可以这样处理:
Button1.Attributes["onClick"]="javascript:
returnconfirm('Areyour
sure...');";最后的效果如我们想像。
五、关于代码重用
ASP.NET已经基本转向了OO的层面上来,其中的代码基本都是通过类来执行的。
就像我们写C/S系统一样,用一个或者多个Class来保存公用的函数,然后再在其他函数中调用。
还有一个方法就是写到一个基类里,其他类继承这个基类。
至于用那种方法,那看个人爱好以及函数的处理范围。
六、Web控件
有几个控件是我们应该有很深的理解的:
DataGrid、DataList。
这两个控件在显示数据上为我们提供了极大的方便,它们的各种用法,需要我们在实践中不断摸索、不断总结。
另外,自定义控件也是一个比较重要的范围。
在自定义控件的类型选择上,如果你只是一般的显示一些固有的控件,而不作属性、事件的操作,那写成UserControl会简单一点,这样的自定义控件相当于ASP中通过include执行的代码。
如果你想在设计、运行中修改控件内部的属性、得到控件的某些事件,那最好写成一个dll文件,也就是写成一个类,这样的控件可以像一般的Web控件一样,用鼠标拖动大小,设置属性,获取事件等。
七、提高程序性能
其实这是一个通性问题,在任何的Web架构中都是一样的.
1.尽量使用事务
特别是在写入数据库时,TransactionScope可以有效减少数据库的连接次数
2.各数据库操作共用Connection
在我的程序中,使用了AEntity,通过LinqtoEntities来进行查询,而使用我自定义的数据库类来CUD,经测试二者使用同一个Connection大大的提高了连接数据库的性能.这个也可以用在LinqtoSql.
八、架构与模式
其实我觉得Models的含义并不止于实体,其实也有数据的读写功能
将数据的读写封装成类,在适当的Controller中调用其实是一个很好的方法,相信很多朋友已经这么做了.
而封装数据操作我觉得使用Mediator模式比较合适,这样可以将各实体关连,也做到了很好的分类。
9、代码事例
1.代码后置(CodeBehind)好处:
代码和页面内容分离,使代码更清晰2.控件的可拖移:
选中控件-->菜单-->布局-->位置-->绝对定位
3.打开"服务器资源管理器":
视图-->服务资源管理器
4.有分页功能的数据展示控件:
GridView、DetailView
作添加功能时,如果直接连数据库,拉入DetailView要更改属性DefaultMode为Insert
5.放在App_Code中的文件是全局文件
6.控件的AutoPostBack属性在使用DropDownList控件如果需要数据随下拉框的值更改时改变时,需要将此属性设置成true
7.数据传递
(1):
get获取:
Request.QueryString["paraName"]
(2):
post获取:
Request.Form["paraName"]
1:
在一般情况下本页面post到本页面[回传]
判断是首次加载还是回传-----IsPostBackif(!
IsPostBack)...页面第一次加载时,执行if里面的代码
2:
跨页跳转
2.1:
Button--PostBackUrl[Click事件不会执行]跨服务器,相似于Click事件中Response.Redirect(url)
2.2:
Server.Excute不转移控制权,本页面显示Url重定向(不跳转到别的页面)
2.3:
Server.Transfer转移了控制权,本页面不显示(Server.Transfer)
备注:
.NET已经对get,post进行了封装
8.状态保持
(1):
Session:
Session["UserData"]-->Session["UserData_SessionID"]
Clear()-->清空Session,不改变SessionID
Abandon()-->清空Session,改变SessionID,结束当前会话,所有信息消失
(2):
Application
定义在全局应用程序类[Global.asax]中的Application_Start
(3):
Cookie:
只能保存文本,可以序列化成xml保存
Response.Cookies[Cookie名称].Value=变量值;在客户端写入Cookie
string变量名=Request.Cookies[Cookie名称].Value;读取客户端Cookie
HttpCookiehcCookie=newHttpCookie(Cookie名称,值);//新添加一个Cookie
hcCookie.Expires=DateTime.Now.AddYears
(1);//新建Cookie在本机上的保存时间为1年
Response.Cookie.Add(hcCookie);
(4):
ViewState
页面级别的状态保存--object
序列化---远程传输
缺点:
性能低,不安全,一般不用
(5):
用隐藏控件
HiddenField---string
9.Server
A:
MapPath--得到的是物理路径
应用:
保存文件时一定需要一个完整的物理路径
例如:
网站根目录:
D:
//MySchool
代码:
Server.MapPath("~/upFile/ziliao.txt")返回路径:
D:
//MySchool/upFile/ziliao.txt
10.页面执行顺序
(1):
Page_Load
(2):
验证事件
(3):
服务器控件事件如Button_click
(4):
Renderhtml生成事件
//在所有事件执行完毕后再执行该事件
protectedoverridevoidOnPreRender(EventArgse)
{}
11.获得客户IP地址:
Request.UserHostAddress;
12.页面之间的数据传递:
protectedvoidPage_Load(objectsender,EventArgse)
{
if(Page.PreviousPage!
=null)//当判断时,又会跳转的源页面,执行源页面的代码
if(PreviousPage.IsCrossPagePostBack)
this.lblShowURL.Text="您的查询条件为:
"+((TextBox)this.PreviousPage.FindControl("txtKeyWord").Text;
}//一般不用这种方法,而用
if(Request.Form["txtKeyWord"]!
=null)
this.lblShowURL.Text="您的查询条件为:
"+Request.Form["txtKeyWord"];
13.服务器控件AutoPostBack自动回发
如果一个对象有runat="server"则其是服务器控件
服务器控件必须放在服务器form中,一个页面只能有这一个表单
14.在后置代码中隐藏HTML服务器控件:
this.divHead.Style.Add("display","one");
15.让按钮不作验证:
设置按钮的CausesValidation为false
16.ValidationGroup可使不同的控件在不同的组中,各自不受其它控件事件的影响
17.动态改变母版页
前提条件:
所有ContentPlaceHolderID一致
this.MasterPageFile="~/母版.master";
18.隐藏母版页中ID=loginOrRegister的控件
this.Master.FindControl("loginOrRegister").Visible=false;
内容页给母版页的文本框赋值:
if(this.Master!
=null)
TextBoxtxt=this.Master.FindControl("TextBox1")asTextBox;
if(txt!
=null)
txt.Text=this.TextBox1.Text;
19.ServerCtrl.ClientID
document.getElementById("<%=this.TextBox1.ClientID%>").Value;//给子页面名称为TextBox1的文本框赋值
1:
三层,工厂模式[反射]
抽象工厂
反射[spring]:
工厂,策略,provider
抽象工厂和反射细节区别
A:
DALFactory
B:
配置文件
appSettings-->name=dalType
value=RoleRightSys.SqlServerDAL
(1):
value必须是程序集名称[不包括扩展名]
(2):
程序集项目中的程序集名称和默认命名空间要相等
(3):
将生成的程序集反射成对象
publicstaticTCreateOjectDal
{
stringpath=DBType;
className=path+"."+className;
return(T)Assembly.Load(path).CreateInstance(className);//找程序集-->实例化类-->转为父类
}
例如:
DBType=RoleRightSys.SqlServerDAL
className=RoleInfoDal
T=IRoleInfo
最终:
className=RoleRightSys.SqlServerDAL.RoleInfoDal
1):
Assembly.Load(path)加载path指定的程序集
错误:
程序集找不到----->工厂项目和path指定的项目不再同一目录
程序集名称错误----->查看项目的属性-->程序集名称
2):
CreateInstance(className)---实例化对象
错误:
命名空间或类名不匹配,区分大小写
3):
确保实例化对象继承了T所指定的接口
程序集:
.exe[控制台应用程序,window应用程序]或.dll[类库]
用反射实现的优点:
A:
代码简捷一个类一个方法
B:
扩展性更好[功能扩展:
多一个接口,支持扩展:
多一个数据库]
2:
xml操作[基础]
A:
xml的序列化
1):
更加简单地替换IO操作
2):
结合WebService工作
3):
配合Ajax工作
要求
1):
被序列化的类必须用public修饰
2):
被序列化的类必须有默认的构造函数
3):
被序列化的相关类也必须满足1),2)条件
使用场合
1):
单纯为了数据持久化
2):
为了实现依赖缓存
缺点:
不能按需求完成层次结构
20.页面中输出客户端脚本(JavaScript)
this.Page.ClientScript.RegisterStartupScript(this.GetType(),"","");
1:
GridView展示:
多行多列数据
DataList展示:
多行单列数据
Repeater展示:
单行多列数据
2:
PagedDateSource类的分页
CurrentPageIndex当前页
PageCount总页数
Count总记录数
PageSize每页记录数
DataSource数据源
AllowPaging控件是否自动分页
IsFirstPage控件是第一页
IsLastPage页面是最后一页
例:
PagedDataSourcesavePage=newPagedDataSource();
savePage.DataSource=BookManager.GetOrderedSmallBooksByCategoryId(0,ViewState["Order"].ToString());
savePage.AllowPaging=true;//不写不会分页
savePage.PageSize=12;
savePage.CurrentPageIndex=Pager;
this.Repeater.DataSource=savePage;
this.Repeater.DataBind();//不写不会显示
3:
ViewState["名称"]=值;页面级别的信息保持,不影响其它页面的分页
4:
ASP.NET在处理HTTP请求时的两个核心的机制是HttpModule和HttpHandler
5:
用户控件后缀名:
.ascx(Web用户控件)
注意:
(1).用户控件可以包含其它用户控件
(2).用户控件不可以单独访问
(3).用户控件不可以自己访问自己
(4).不能导入Style样式
(5).内容页的Load事件比用户控件的Load事件先执行
在这短短的几个月中,我知道在程序设计的时候,不要太在意程序是否最简洁灵活,对于一般开发者而言,程序规范化和可读性可能比追求程序的灵活性更加重要。
在互联网资源越来越丰富的情况下,我们可以参考一些规范的程序源代码来学习。
同时我也知道想要学好这门课程所要具备很多条件:
首先打代码要规范,要做注释,这样回头来看程序时可以很快的看懂,一方面可以练习自己的逻辑表达能力,对以后遇到难以实现的功能也可以很好的表达出来向别人请教,而且出去从事编程工作的话,代码的规范是相当重要的。
还有一点要学会总结,把自己做的程序用到的知识点列出来就可以很好的总结自己的知识点。
当形成知识体系,对知识的理解就会更上一层楼。
通过这个阶段的学习,我觉得在学习方法上应该注重思考与及时总结。
一些知识,在学习的时候觉得简单,不用刻意去思考,可是一旦过了这个阶段,失去了这个环境,回想起来就觉得困难了。
即便是日后用的时候算查也会多费了不少劲儿。
所以以后的学习应该多思考、及时总结。
同时,对SQL大型数据库的认识才有了质的改变。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Asp 学习体会