1. Label控件和Literal控件
- Label控件默认地把它的内容呈现在一个HTML<span>标签中。
- Label控件支持一些格式化自身显示的文本属性,如BackColor,BorderStyle,CssClass,Font等。
- Label控件拥有属性AssociatedControlID,可以设置此属性来指向表单字段的asp.net控件。为Label控件提供AssociatedControlID属性后,Label控件将呈现成HTML<label>标签而不是<span>标签。使用AssociatedControlID属性的一个好处是,当点击标签时,自动把表单焦点设置成为关联的表单输入框。另外对残障人士和使用像读屏器这样的辅助设备来与网站交互很有帮助。
- Literal控件类似于Label控件。但Literal控件并不把它的内容呈现在一个<span>标签中。如下面代码使用Literal控件动态地修改显示在浏览器标题栏中的标题。
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
void Page_Load()
{
ltlTitle.Text = DateTime.Now.ToString("D");
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title><asp:Literal id="ltlTitle" Runat="Server" /></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h1>Look in the title bar</h1>
</div>
</form>
</body>
</html>
Literal控件不支持任何由<span>标签支持的格式化属性(如CssClass、BackColor等)。它只支持一个Label不支持的属性——Mode属性。Mode属性用于编码HTML内容,它的三个值是:PassThrogh、Encode和Transform。
2. TextBox控件
- TextBox控件依赖TextMode属性来显示三种不同类型的输入框,分别是:SingleLine、MultiLine和Password。
- 当AutoPostBack属性设为true时,TextBox内容发生改变就会使表单自动回传到服务器端。为提供辅助功能,应避免使用此属性,如果一定要使用,应该包含一个ToolTip属性值来通知用户页面将重新加载。
- TextBox控件的AutoComplete属性默认是启动的(可以在IE中,选择工具——Internet选项——内容——自动完成来配置AutoComplete),用户无需在表单字段中重复输入像名、性或电话之类的信息。
4. 按钮控件
- asp.net包含Button、LinkButton和ImageButton三种按钮控件。三种按钮控件都支持OnClientClick属性,用来执行点击按钮时所需要的客户端代码。像大多数asp.net控件一样,按钮控件支持扩展属性,使其可以处理其他的客户端事件。示例代码:
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Button Expando</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button id="btnSubmit" Text="Submit" οnmοuseοver="this.value='Click Here!'" οnmοuseοut="this.value='Submit'" Runat="server" />
</div>
</form>
</body>
</html>
该示例演示当鼠标停在按钮上,按钮上的文字会改变。 - 默认情况下,点击一个按钮,就会把包含这个控件的页面提交回该页面本身并重新加载相同的页面,可以使用PostBackUrl属性把表单数据提交到其他页面,执行跨页面发送。下面的代码清单1中的按钮把页面提交到代码清单2的页面。
代码清单1:
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Button Search</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label id="lblSearch" Text="Search:" Runat="server" />
<asp:TextBox id="txtSearch" Runat="server" />
<asp:Button id="btnSearch" Text="Go!" PostBackUrl="ButtonSearchResults.aspx" Runat="server" />
</div>
</form>
</body>
</html>
代码清单2:
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
void Page_Load()
{
if (PreviousPage != null)
{
TextBox txtSearch = (TextBox)PreviousPage.FindControl("txtSearch");
lblSearch.Text = String.Format("Search For: {0}", txtSearch.Text);
}
}
//PreviousPage属性用来得到前一个页面的引用。
//FindControl()方法用于从前页面中获取控件。
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Button Search Results</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label
id="lblSearch"
Runat="server" />
</div>
</form>
</body>
</html>
可以通过页面属性来暴露控件的方法来替代以上代码中FindControl()方法从前面的页面获取某个控件。
代码清单3:
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
public string SearchString
{
get { return txtSearch.Text; }
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Button Search Typed</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label id="lblSearch" Text="Search:" Runat="server" />
<asp:TextBox id="txtSearch" Runat="server" />
<asp:Button id="btnSearch"Text="Go!" PostBackUrl="ButtonSearchResultsTyped.aspx" Runat="server" />
</div>
</form>
</body>
</html>
代码清代4:
<%@ Page Language="C#" %>
<%@ PreviousPageType VirtualPath="~/ButtonSearchTyped.aspx" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
void Page_Load()
{
if (Page.PreviousPage != null)
{
lblSearch.Text = String.Format("Search For: {0}", PreviousPage.SearchString);
}
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Button Search Results Typed</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label id="lblSearch" Runat="server" />
</div>
</form>
</body>
</html>
代码清单4中的页面包含一个<%@ PreviousPageType %>指令。这个指令把PreviousPage属性返回的值转换成页面3对应类的实例,没有这个指令,PreviousPage属性会把前页面作为通用的Page类的实例返回。
执行跨页面提交时,可以使用以上两种方法的任意一种,第一种方法提供从前面页面获取值的弱类型方法(untyped,指没有为实例指定详细的类型,这样就不能直接引用详细类型特有的属性、方法和事件。如代码清单2,因为其PreviousPage属性返回的是通用Page类,所以只能通过Page类的FindControl()方法来在前页面中获取控件。);第二种方法提供强类型方法(typed,如代码清单4,因为PreviousPage返回的是具体的页面类型,所以可以直接用PreviousPage.SearchString来获取页面3对应类独有的属性。)。 - 可以使用服务器端Form控件的DefaultButton属性来指定表单的默认控件,这样可以按回车键调用这个按钮。
<form id="form1" defaultbutton="btnSearch" runat="server"> - 三种按钮控件都支持Click事件和Command事件。可以传递命令名和命令参数给Command事件处理程序,而不能传给Click事件。下面示例演示这两个事件的不同:
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Collections.Generic" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
private List<String> groceries = new List<String>()
void Page_Load()
{
groceries.Add("Milk");
groceries.Add("Steak");
groceries.Add("Fish");
}
protected void Sort_Command(object sender, CommandEventArgs e)
{
if (e.CommandName == "Sort")
{
switch (e.CommandArgument.ToString())
{
case "ASC":
groceries.Sort(SortASC);
break;
case "DESC":
groceries.Sort(SortDESC);
break;
}
}
}
void Page_PreRender()
{
bltGroceries.DataSource = groceries;
bltGroceries.DataBind();
}
int SortASC(string x, string y)
{
return String.Compare(x, y);
}
int SortDESC(string x, string y)
{
return String.Compare(x, y) * -1;
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Button Command</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button
id="btnSortAsc"
Text="Sort ASC"
CommandName="Sort"
CommandArgument="ASC"
OnCommand="Sort_Command"
Runat="server" />
<asp:Button
id="btnSortDESC"
Text="Sort DESC"
CommandName="Sort"
CommandArgument="DESC"
OnCommand="Sort_Command"
Runat="server" />
<br /><br />
<asp:BulletedList id="bltGroceries" Runat="server" />
</div>
</form>
</body>
</html>