ASP.NET Page 和一些基本控件

ASP.NET 专栏收录该内容
5 篇文章 0 订阅

个人学习笔记。

Page 类成员

通过 Request、Response 和 Server 实现对 context.Request、context.Response 和 context.Server 的调用简化。

通过 AppRelativeVirtualPath 获得页面相对于应用根路径的路径。

FindControl(controlId):根据控件 id 找到控件。

IsPostBack、Session

ResolveClientUrl(url):将虚拟路径转化为客户端访问的路径。

ResolverUrl(url):将虚拟路径转化为相对于网站根目录的路径。

HTML 控件

ASP.NET 把 HTML 控件当做普通字符串渲染到浏览器端,不会检查其正确性,无法在服务器端进行处理。

ASP.NET 基本控件

ASP.NET 服务端控件是对 HTML 的封装,可在服务器端进行操作,会渲染到客户端成为 HTML 控件。控件大多从 Control、WebControl 类中继承,它们都有的成员:
ClientID:控件在客户端的 id,控件在服务端的 id 不一定和客户端 HTML 中的 id 相同。

Visible:是否可见。

CssClass:控件的样式名,即 HTML 中控件 class 的属性。

Attribute:设置获取控件的额外属性。

Label

AssociatedControlID 属性用来关联一个控件,为空时会展示为 Span,指定为一个控件的 id 时会展示为 HTML 的

Literal

不会渲染任何额外的标签,只展示 Text 属性内容。

TextBox

TextMode 属性常用取值有SingleLine、MultiLine 和 Password,分别渲染为 input(type=text)、textarea 和 input(type=password)。
AutoPostBack 属性为 true 时,用户焦点离开 TextBox 时就会自动让页面 Post。
TextChanged 事件在文本内容发生变化时触发。

RadioButton

渲染为 input(type=radio),通过GroupName 属性进行分组。

Button

OnClientClick 是字符串属性,JavaScript 代码。

LinkButton

Button 渲染为按钮,LinkButton 渲染为超链接。LinkButton 的 href 是 JavaScript 代码,进行的是表单的 Post,无法在新窗口中打开。不建议使用。

ImageButton

渲染为 input(type=image)。

Button、LinkButton 和 ImageButton 等控件都有 CommandName、CommandArgument 属性和 Command 事件;可以让多个按钮共享同一个 Command 事件处理方法,通过读取事件对象的 CommandName 和 CommandArgument 两个属性来执行不同的操作。

Panel

用来放其他控件。如设定GroupngText 则渲染为 <fieldset>,即 GroupBox 效果,否则渲染为 <div>

HyperLink

超链接。与 LinkButton 不同,不会向服务器端 Post。

FileUpload

文件上传控件,渲染为 input(type=file)。FileContent 属性表示以流形式获得上传的文件,SaveAs 方法用于将文件保存到磁盘的指定位置。

RangeValidator

范围验证控件。MinimunValue、MaximunValue 分别为最小值和最大值,Type 是数据类型。
RangeValidator、CompareValidator 和 RegularExpressionValidator 等都不会对非空值进行校验。

CompareValidator

比较验证控件。Operator 是比较操作符,可选值:DataTypeCheck、Equal、GreaterThan、GreaterThanEqual、LessThan、LessThanEqual、NotEqual。
ValueToCompare 会比较运算符右边的值,ControlToCompare 设定与另外一个控件比较。

RegularExpressonValidator

正则表达式验证控件。ValidationExpression 属性为正则表达式。

CustomValidator

自定义验证控件。

ServerValidate 事件

该事件为服务器端的校验代码,在事件处理方法中读取 args.Value 来获取待校验的值,合法设为 true。如果 ClientValidationFunction 设定一个方法名,首先会在客户端调用指定的 JavaScript 函数进行客户端校验,否则只做服务器端校验。在客户端校验方法的签名为:<function_name>(src, args),args 属性及意义与服务器端相同。

runat=server 的 HTML 控件

在 HTML 控件中添加 runat=“server” 是运行在服务器端的,且可以在服务器端进行操作,也能够渲染到客户端,并不同 ASP.NET 控件一样高度封装。和 ASP.NET 控件相比好处是:需要在服务器端进行操作时,如果控件没有被 ASP.NET 封装,用这个方法会很方便。runat=“server” 的 HTML 控件也会对虚拟路径进行处理。

数据绑定控件

数据绑定分为数据源和数据绑定控件两部分,数据绑定控件通过数据源获取数据,通过数据源隔离数据提供者和数据使用者并通过数据源对数据进行修改。数据源有:SqlDataSource、AccessDataSource、ObjectDataSource、LinqDataSource、EntityDataSource、XmlDataSource等(SiteMapDataSource 是 SiteMap 专用数据源)。因为页面直连数据库违反最基本的分层原则,所以 SqlDataSource 和 AccessDataSource 基本不会使用,而 LinqDataSource 和 EntityDataSourfce 也只是在很极端的采用 Linq 和 EF 项目中才会使用,XmlDataSource 是只处理 XML 数据使用。ObjectDataSource 是 Web 开发中应用最广的数据源。
数据绑定控件有列表数据绑定控件:DropDownList、RadioButtonList、ListBox、CheckBoxList 和 BulletedList 等,和复杂控件:DataGrid、GridView、DetailsView、FormView、ListView、Repeater 和 DataList 等。复杂控件中 DataGrid 已不推荐使用,Repeater 是最轻量级的控件,在前端使用的最多,ListView 是 GridView、DetailsView、FormView、Repeater 和 DataList 等控件的统一。

ObjectDataSource

ObjectDataSource 用来将一个类作为数据源,TypeName 属性是数据源类的类名,还有增删查改:InsertMethod、DeleteMethod、SelectMethod、UpdateMethod 等其他属性。增删查改方法可能有参数,参数值通过 DeleteParameters、UpdateParameters 和 InsertParameters 等嵌套字点设置。
可通过可视化界面将 ObjectDataSource 拖放到界面,在右上角智能标志上选择“配置数据源”进行配置。数据源类一般采用数据集。

列表绑定控件

DropDownList 显示来自 ObjectDataSource 的数据,DataSourceID 属性是选择数据源,之后要设定显示字段(DataTextField)和值字段(DataValueField)。类似的 RadioButtonList、ListBox、CheckBoxList 和 BulletedList 等用法相同。
还可以通过代码来绑定,现已不推荐该方法。用代码绑定可以将任何实现了 IEnumerable 接口的对象绑定到数据绑定控件中。
Eg.ListBox2.DataSource = new object[]{1, 2, 3}; ListBox2.DataBind();
数据绑定控件会默认将数据保存至 ViewState 中,因此不会每次刷新页面都重新加载数据,只有第一次进入时需要加载;所以代码绑定在 ViewState 被禁用时会产生各种麻烦,而使用 DataSourceID 的方式中,控件会自动判断是否重新获得数据。

复杂数据绑定控件

当想要将包含文本和图片信息显示在界面上时,要使用 Repeater、ListView 等控件。
在 HTML 中,表格是手写的,是一种静态的,而很多数据是不固定的、是动态的;可以使用 DOM 动态增加表格行,但此时数据仍是固定的,就需要从数据库等地方取得动态的数据进行显示。

Repeater

Repeater 用于对绑定数据源中的数据进行遍历显示,显示格式由 Repeater 的 <ItemTemplate> 决定。
Eg.<ItemTemplate>姓名:<%#Eval("Name")%><b>年龄:<%#Eval("Age")%></b></ItemTemplate>
调用 Eval、Bind 等数据绑定方法时需加上 #。Eval 就是将属性显示到指定位置,所以也可以在文本框中显示:
<ItemTemplate>姓名:<input type="text" value='<%#Eval("Name")%>'/></ItemTemplate> <asp:TextBox Text='<%#Eval("Name")%>' runat="server"></asp:TextBox>
Repeater 还有如下模板:
<AlternatingItemTemplate> 设置隔行的不同显示风格,如设定,则奇数行使用 <ItemTemplate> 模板,偶数行使用<AlternatingItemTemplate> 模板。可以实现颜色相间的效果。
HeaderTemplate、FooterTemplate:头部和尾部的模板,分别显示在所有数据的前面和后面。
SeparatorTemplate:两项数据之间的分隔符,例如换行符。

ItemDataBound

对于每行数据显示的时候都会调用 ItemDataBound 事件,在这个事件中可以对当前行进行处理,该事件对象的主要成员有:
e.Item.ItemType 是当前行的类型,Item 是 ItemTemplate 行、AlternatingItem 是 AlternatingTemplate 行,还有 Header、Footer 等取值。
ItemIndex 是当前行的序号。
DataItem 是当前行绑定的对象。
如果想要在 ItemDataBound 事件中对 ItemTemplate 模板中的控件做处理,必须使用 runnat=“server” 的 ASP.NET 控件或者 HTML 控件,并为控件设置 id,用 FindControl 根据 id 获取控件。

ItemCommand

可以在模板中放置 Button 控件,但模板中的按钮一般不写OnClick事件响应,而是响应 Repeater 的 ItemDataBound 事件。
需要给 Button 控件设定 CommandName、CommandArgument 属性,然后在 ItemDataBound 事件读取 e 的 CommandName、CommandArgument 属性就可以获得发生事件的命令和行参数了。如果对数据进行了操作,则需要 Repeater.DataBind() 来重新绑定,从数据库中刷新至最新的数据。

ListView

Repeater一般只用来展示数据,如果要增删查改则使用 ListView 更方便。使用向导来使用 ListView 会自动生成很多模板。LayoutTemplate 为布局模板。
EditltemTemplate、insertItemTemplate 中控件的绑定表达式为 Tex=’<%# Bind(“Name”),因为 Eval 只是计算表达式的值输出,而 Bind 不仅可以计算表达式的值输出,还可以将用户填入的值更新到数据库中,因此 Eval 是单向绑定, Bind 是双向绑定。
通过每行的 Insert、Delete、Edit 和 Cancel 等 Command 进行增删改,这些 CommandName 被 ListView 内部处理, 不需要开发人员手动处理,所以自定义的 CommandName 不能和这些重复。ListView 可以像 Repeater 一样为行增加 Command 按钮,处理方法也一样,同时也支持 Repeater 的 ItemDataBound 事件。
ListView 可以使用 Validator,只需将其放入相应的模板中,将 Validator 手动设置为要验证的控件 id,然后设定相应按钮、控件、Validator 为同样的 ValidationGroup,确保不同模板中的 Validator 互不干扰。
ListView 中是无法像 TextBox 等控件那样将 DropDownList 的选中值绑定到数据的字段的,必须编程处理:

  1. 在显示数据的时候 DropDownList 显示数据的值。在 ItemTemplate 中加入 DropDownList,设定 DropDownList Enabled=“false”,就是只读的。在 ItemDataBound 事件中 e.Item.FindControl() 来找到 DropDownList 控件,然后
ListViewDataItem lvDataItem = (ListViewDataItem)e.Item; 
DataRowView rowView = (DataRowView)lvDataItem. DataItem;

取到 DropRowView 进而取到 DataRow,读取数据的值,然后赋值给 DropDownList 的 SelectedValue 属性。

  1. 在插入数据的时候设定 DropDownList 对应的字段的值,然后通过 e.Value 设定值。
  2. 在数据更新的时候设定 DropDownList 对应的字段的值,响应 ItemUpdating 事件。

ListView 的行按钮和 Repeater 一样,不同的是获取当前行数据的方式。
通过 int index = ((ListViewDataItem)e.Item).DisplayIndex; 获取操作行的行号,通过 ListView.DataKeys[index].Value 获取主键的值;如果对数据进行了修改,还需对 ListView 执行 DataBind 刷新数据。由 DataKeyNames 属性决定存储哪些字段值为主键,可以设定多个主键(和数据库没直接关系)。
将 LayoutTemplate 中的表头用 <asp:LinkButton runnat="server" CommandName="Sort" Text="id" CommandArgument="id"/> 代替,即可实现排序;CommandArgument 的值为排序字段。

DataPager

将 ListView 和 DataPager 控件实现分页。有两种方式:

  1. 将 DataPager 声明到 ListView 中;
  2. DataPager 和 ListView 无嵌套关系,将 DataPager 的 PagedControlID 设定为要分页的 ListView。

一般用“配置 ListView”自动生成的内置方式即可。DataPage 的 PageSize 属性为一页的条数。
实现了 IPageableItemContainer 接口的控件都可以使用 DataPage 进行分页。
DataPager 按钮风格通过 Fields 中的字段设置,可以放置多个字段,分为“NextPreviousPagerField”、“NumericPagerField” 和 “TemplatePagerField”。

NextPreviousPagerField 主要属性:
ButtonCssClass:按钮的样式;
ButtonType:渲染类型(Button、Link、Image);
FirstPageImageUrl:第一页按钮图片地址;
FirstPageText:第一页按钮文本;
ShowFirstButton:是否显示第一页。
NumericPageField 主要属性:
ButtonCound:数字个数,渲染类型(Button、Link、Image);
CurrentPageLabelCssClass:当前文本样式;
NumericButtonCssClass:数字按钮的样式。
实现 |<</</页数/>/>>| 的效果:顺序添加 NextPreviousPageField、NumericPageField、NextPreviousPageField 后,将第一个 NextPreviousPageField 的 First、Previous 设置为可见,Last、Next 设置为不可见,将最后一个 NextPreviousPageField 的 First、Previous 设置为不可见,Last、Next 设置为可见。
想要实现输入页面编号点击跳转或者下拉列表中选择页数要用 TemplatePagerField。

ListView 默认分页是先从数据库获取所有数据,在截取当前页面部分,当数据量很大时效率很低,因此不推荐使用;应当从数据源取得当前页面显示的数据:

SELECT * FROM (SELECT <column_name_1>, <column_name_2>, ROW_NUMBER() OVER(ORDER BY <column_name_1>) ROWNUM FROM <table_name> t WHERE t.ROWNUM > <number_1> AND t.ROWNUM < <number_2>)

ROW_NUMBER() 是一个计算结果集行数的函数,OVER 中指定排序规则。ROW_NUMBER() 从 1 开始。上述代码实现从第 <number_1> 到 <number_2> 数据(从 0 开始)。

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 1024 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值