代码改变世界

服务器控件使用技巧

2012-05-29 20:35  刘永强  阅读(1084)  评论(0)    收藏  举报

RequiredFieldValidator:非空验证控件

用于:必填项

使用方法:

1)拖一个控件

2)设置ControlToValidate属性  (要验证的控件)

3)设置验证控件验证不通过要给用户显示的信息.  一般设置Text属性,当Text属性为空时,显示的内容会自动取ErrorMessage的值

这个控件所独有的一个属性:

InitialValue:设置初始值

 

验证控件的一般属性:

Display: none  不显示   static:不显示也占位    dynamic:不显示不占位 通过 display:none样式实现

SetFocusOnError:当该验证控件不没有通过验证时,自己获得焦点.

 

Page.IsValid:在服务器端指示前端的所有验证控件是否验证通过.如果前端有服务器端控件,就必须在后端判断这个属性.

 

注意:验证控件在服务器端验证是在:Page_Load事件之后,更深层事件之前执行.比如你点击了一个按钮:在服务器端: 先执行Page_Load事件,再执行验证控件的验证方法,最后执行按钮的click事件

Page.Validate();//如果要想在Page_Load事件用使用Page.IsValid,那么必须先执行这个方法让验证控件进行验证.

 

CompareValidator:

用于比较

第一用法:用于两个控件相互比较

使用步骤:

1)见上面的同用步骤

2)ControlToCompare 设置被比较的控件

3)设置 Operator属性:比较方式

4)设置type属性:比较的类型

 

注意:在我们的验证控件中,只有非空验证控件可以在用户不输入任何内容的情况下触发验证,其他验证控件只有在输入的内容为非空时才触发.

 

第二种用法:与一个定值进行比较

使用步骤:

1)与第一种类似

2)把第一种中的第二步:  改为设置ValueToCompare属性

 

第三种用法:类型检查

1)设置通用步骤

2)设置Operator属性为:DataTypeCheck

3)设置Type:等检查的数据类型

 

 

RangeValidator:用于在某一个范围内的验证

1)通用步骤

2)MinimumValue

3)MaxmumValue

4)Type

 

 

RegularExpressionValidator:正则表达式验证

1)通用步骤

2)ValidationExpression设置正则表达式

 

 

CustomValidator:自定义验证控件 

要求我们自己写客户端js代码进行验证,要求我们自己写服务器端的代码是行验证.

只是调用这些验证的方法由我们的程序自动调用了.

 

客户端的js脚本有两个参数,第一个为验证的控件,第二个为参数,设第二个为 args

 

       //args.Value 获得被验证的值

       //args.IsValid设置本验证控件是否验证通过

 

 

ErrorMessage: 是为汇总错误控件提供错误信息的

Text: 才是真正的显示在被验证控件旁的错误信息

汇总验证控件: ValidationSummary

ShowSummary: 以文本的形式显示错误信息

ShowMessageBox:以模式对话框的形式显示错误信息

 

 

所有提交的按钮都有一个属性叫:CausesValidation 这个属性指示该按钮是否触发验证控件

 

当需要点某个按钮,个别验证控件进行验证时,则需要设置按钮和验证控件的ValidationGroup

 

Js端:

var Page_IsValid = true;  页面上所有的验证控件,是否通过验证.默认为ture

Page_ClientValidate(null);  调用每一个验证控件的验证方法

每一个验证控件,都有一个isvalid属性,可以通过这个属性,来得到这一个验证控件是否通过验证.

 

E:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG 这里面有两个全局配置文件.machine.config   web.config

 

 

1) 修改模中的有外键的实体类,让实体类做为属性

2) 数据库访问层:

a)         Add方法

b)        Update方法

c)         GetModel方法

3) 业务逻辑层中:

a)         DataTableToList

 

 

第二天:

导航控件:

1)SiteMapPath 面包屑导航 眉毛导航

   需要一个 站点地图为其提供数据 (web.sitemap)

站点地图只能在网站根目录,并且名称只能是web.sitemap

站点地图其实就是一个xml文件,只不过站点地图对xml文件中的节点是有要求的:

A)根节点必须是siteMap节点

B)在根节点下有且只能有一个 siteMapNode 节点,这个节点代表我们网站的首页(主页)  这个节点有三个属性: url 指示首页地址 title: 文字显示  description: 鼠标放上去的提示文字

C)在B节点下面,就可以根据网页的层次关系来一层一层的套siteMapNode,每一个siteMapNode 节点表示一个网页

 

Page.ClientScript.RegisterClientScriptBlock(this.GetType(),键,脚本,是否自动加<sacript>标签)

把脚本输出到 <form>表单内,我们自己的控件前面.

 

Page.ClientScript.RegisterStartupScript 和上面的方法作用一样,不同的是输出脚本的位置在我们的所有控件之后.所以要通过代码输出js对页面上的控件赋值,可以用这个方法.

 

第三天:

由于母板页和用户控件可以被其他任何目录中的普通页面使用,所以在写母板页和用户控件时,最好用绝对路径或应用路径来指明相关的文件路径.

 

            ResolveClientUrl 

            ResolveUrl

 

Cookie:分为两种:

浏览器Cookie(临时Cookie):  存在浏览器的内存中,浏览器一关闭,就没有了.

持久Cookie:存在用户的磁盘上   (Cookie设置一个过期时间这个Cookie就变成了持Cookie写在磁盘上了)

 

 

自动登录的实现:

方法一:

在用户表中,再添加一个字段,akey,当用户选中记住我时,生成一个Guid,放入当前登录用户后对应的数据库表记录中,并把这个akey存入用户cookie.

当用户下次没登录访问时,我们可以从cookie中得到这个akey, 从数据库中查询得到这个akey对应的用户名和密码,自动把这个用户实体写入Sesssion["currUser]

好处:安全性比较好,因为客户端没有任何用户资料.

缺点:只能在一台电脑上实现记住我,不能让两台电脑同时记住我.

 

方法二:

我们就把用户名和密码写入到客户端.由于向客户端写资料了,所以我们要进行加密.

1)随机产生一个两位的字母   s

2)设用户的数据库中的密码为:p    

3)向客户端存的密码为:     s+Md5(s+md5(p))

 

把用户名和密码写入到客户端.

 

下次再登录时,只需要读出cookie中的用户名和密码,然后根据用户名从数据库中得到该用户名所对应的密码,然后把这个密码按照上面的算法加密.然后对比是否相同,如果相同,则这个cookie是我们写入的.让用户自动登录.

 

 

TreeView生成树:

1)写代码,通过对Nodes添加节点

2)通过站点地通添加节点

3)通过xml添加节点

 

数据源控件:负责读取数据,并把数据提供给数据绑定控件显示

数据绑定控件:得到数据,并显示出来

 

绑定数据有两种方法:

第一种:通过数据源绑定

1)只需要设置绑定控件的DataSourceId属性=数据源控件,并设置数据源控件能读取到数据就可以了.

 

第二种:手写代码绑定:

1)得到一个数据集合

2)把这个数据集合赋给数据源绑定控件的DataSource属性

3)执行DataBind()方法

 

什么情况下,控件的id在页面上会变:

1)非服务器端的控件id在页面上不会变.

2)服务器端控件,如果这个控件在母板中(母板页坑里面的控件)会变.

3)服务器端控件,在一些数据绑定控件模板(itemtemplete)中的会变.

4)所以,凡是在客户端访问服务器端控件时,使用<%=控件id.ClientID%>就不会出错了.

 

 

..   当前页面所有的路径的上一级

http://www.cnblogs.com/ 当前页面所有的路径的上一级的上一级

~/  网站应用的根目录

/  http://www.ccctv.com/abc/index.html

红色:叫域名

绿色:叫目录或虚拟目录

蓝色:叫文件名

/表示网站根目录,域名后就是网站根目录

~/表示应用目录  就是bin所在的文件夹.有可能是网站根目录,也有可能是虚拟目录,虚以目录可以做网站的应用目录

如果是虚拟目录: ~//的意义就不一样了

 

 

页大小为10

第一页:  1   10

第二页:  11  20

第三页:  21  30

n:  (n-1)*10+1     n*10

 

 

 

一本图书的内容:

1)建页面

2)放一个DetailsView控件

3)新建一个数据源,配置这个数据源的Select方法,得到我们要的书

4)设置DetailsView控件的Fields属性,设置显示样式.

 

http://www.cctv.com/filefolder/filename.htm

 /:在指定一个网址的时候,直接写/ 永远都是表示域名后的那个/ 即红色的/

 

\不以/开头,也不以~/,(直接写文件夹或文件名或以./  ../开头):这样叫相对路径,是以你这个代码所在的这个网页所有的目录开始定位

./  :和直接写文件名一样.代表当前目录.

                        左面两个路径是等价的

 

../ 也是相对路径定位: 当前目录所在的上一级目录

 

 

~/ 就是你网站所有的那个目录,注意:asp.net网站只能放在iis的网站目录,或虚拟目录

如果网站放在虚拟目录中:~/ 代表该虚拟目录的路径

如果放在网站根目录中: ~/代表网站根目录

 

 

一般网站水印的实现:

1)上传时就对图片加水印:

a)         每次用户访问时,直接给用户图片就行了.减小服务器端的压力.

b)        缺点:破坏了原有图片.如果网站换logo或改名

2)使用一般处理程序:

a)         每次用户请求都要进行水印的添加,增加了服务器端压力

b)        原图片被保存下来了.

 

要建立一个全局的一般处理程序步骤:

1)建一个类文件,继承自IHttpHandler接口并实现其方法,

2)ProcessRequest方法中对用户请求的文件进行处理,如何知道用户请求的是哪一个文件呢?  context.Request.PhysicalPath;

3)写好上述文件后,修改web.config  在   <httpHandlers>节点中添加下面一句话:

  <add verb="*" path="/images/bookcovers/*.jpg"  type="BookShop.Web.Common.wmCode"  />

Verb表示请求方式  GET/POST  可以用*表示所有方式

Path 请求时,要转到全局一般处理程序的文件名  可以使用通配符

Type 把请求转给哪一个一般处理程序去处理,这里写类名.如果是WebSite,那么就写类名就行了.如果是Web应用程序,就写 命名空间.类名

 

实现上面3步,在测试环境下就可以了.如果要是放在iis上,还是不可以.

 

在网站上点右键->属性->主目录->配置

 

 

添加一个映射:

 

 

 

 

1)水印

2)防盗链

3)下载rar/txt文件时进行权限验证

 

 

Hosts文件的路径:

C:\Windows\system32\drivers\etc

 

支付流程:

 

 

 

 

 

 

 

 

 

 

 

AllowPaging:是否启用自动分页,注意.这个分页不是高效.

属性:Editindex:  指示当前哪一行处于编辑状态,如果都不处理编辑状态,则这个值为-1

属性:PageIndex:指示当前要显示哪一页

 

GridView,当我们点击一个按钮,这个按钮的CommandName=

Edit就会自动触发RowEditing 的编辑事件.

Cancel就会自动触发RowCancelingEdit的取消事件.

Update就会自动触发RowUpdating的更新事件

Delete就会自动触发 的删除事件RowDeleting

 

当切换页数时,会触发 PageIndexChanging事件

如果是手写代码进行绑定,上面的事件,需要我们创建并写代才能完成相应的功能.

 

 

 

 

 

当在GridView上翻页时,就会触发PageIndexChanging事件,在这个事件中修改PageIndex属性,PageIndex属性指示当前给用户显示哪一页.

 

如何获得GridView中的值:

1)如该列是 文本形式显示,那么:

GridView1.Rows[行的索引].Cells[列的索引].Text;

2)如果该列正处于编辑状态(当我们不知道这个控件的id的情况下),

((TextBox)GridView1.Rows[0].Cells[1].Controls[0]).Text

 

((CheckBox)GridView1.Rows[0].Cells[3].Controls[0]).Checked

 

 

3)如果要获得模板列中控件的内容,必须通过FindControl来得到该控件

 

 

一个普通列如果一旦隐藏,就无法获得其值了.如果还想获得,就必须添加一个模板列,在模板列中放一个Label或隐藏域,然后在后台才能获得.

 

 

当使用数据源控件进行绑定更新时,下列4个事件的触发顺序:

1)触发控件的RowUpdating事件: 通过e可能获得用户通过Bind绑定的数据更新前和更新后的值 e.NewValues和e.OldValues

2)数据源的Updating事件:这里可以通过e获得要更新的实体对象(在1)和2)事件事,可以对用户修改的数据进行再次更改和校验,如果发现数据不对,可以通过e.Cancel=true来取消更新.如果我们取消更新,那么业务逻辑层方法就不会被调用了)

3)调用在objectDataSource中指定的业务逻辑层的方法
4)数据源的Updated事件

5)控件的Updated事件

 

4)5)这两个事件可以对更新时发生的异常进行处理. 在调用业务逻辑层或数据访问层方法时(第3个事件)一旦发生异常,立即进入事件4)和5) 可以通过e.Exception是否为空得到在业务逻辑层或数据访问层是否引发异常,如果这个异已经被我们写代码处理,不想展示给用户,只需要设置e.ExceptionHandled=true就可以了.

 

 

如何使用第三方的自定义控件:

1)在工具栏上点右键,->选择项

2)

在.net组件中可以找已经注册的控件.如果没有注册,则可以通过浏览去查找.

 

要限控件所用到的表:

Sysfun 系统建档表,用于存储我们系统的程序基础资料

 

 

用户角色表:存储用户的角色,因为我们分配权限时是以角色为单位的.即我们是对角色分配权限的,而不是对单个用户分配的.

 

权限表:

 

 

当一个用户登录时,如何生成导航树????

1)先从用户表中得到用户的角色id,这样我们就能从角色表中得到角色资料(比如角色名称)

2)到权限中根据1中得到的角色id,能得到这个角色都能访问哪些程序的id

3)根据程序基本资料表生成树,在生成树的时候,检测如果该节点当前角色有权权限访问(依次生成基本资料表中的每一个节点时,当前这个节点的id在2)得到的能够访问的id集合中),y就显示这个节点.

 

每一个页面的验证:

1)先得到用户访问的页面路径  path

2)再根据当前用户的角色得到该角色所能够访问的权限集合  list

3)判断在2)中得到的能够访问的权限集合中有没有当前用户访问的这个路径,如果有,说明有权限访问本页,如果没有,说明没权限访问本页.

 

 特殊情况:有的功能块是由一组页面组成的,我们不需要对每一个子节点设置权限.那么可以这么实现,功能块的主页文件名为:  abc.aspx   下面所有子页的文件名必须由abc_XXXX.aspx来起名.当用户访问abc_xxxx.aspx时,发现文件名中有_,则检测当前用户是否有abc.aspx文件的权限就行了.

 

 

如何使用别人的WebServices??

1)首先你得有要调用Webservices的地址 endpoint  阅读相应文档,知道传入和返回的参数

2) 右击引用->添加服务引用

 

 

4)调用

 

全局配置文件的路径:

系统目录\Microsoft.NET\Framework\v2.0.50727\CONFIG

 

Machine.config 全局配置文件 控件我们这台机器上的所有网站

此目录下的 web.config 同上

我们的网站下还可以有web.config

我们网站的目录下还可以web.config

 

以你访问的这个页面为基准,就近原则

 

自定义错误

<customErrors mode="RemoteOnly"   defaultRedirect="ErrorPage.htm">

       <error statusCode="404"      redirect="FileNotFound.htm" />

</customErrors>