8 Asp.Net服务端的基本控件
1.Asp.Net服务端控件是Asp.Net对HTML的封装,在C#代码中就可以用txt1.Text="somevalue"这种方式修改input的值,Asp.Net会将服务端控件渲染成HTML代码输出给浏览器,服务端控件是Asp.Net非常容易上手,也非常吸引初学者,但也是被人诟病的东西。因为它会传输很多无法的东西,如viewstate. 服务端控件在内网或互联网系统的后台部分等访问频率不高的地方还是很适合的。
服务端控件只能用post方式提交,用get很麻烦,因为它携带了大量的数据,如果用get会给用户很大的干扰。
2.所有的Asp.net大部分都有是从Control,WebControl类继承的,几乎所有成员有以下内种属性:
(1) ClientID:控件在客户端的ID,控件在服务端的id不一定等于客户端HTML中的id,如在用户自定义的web控件中放出一个edit和button,它们默认的id为textBox1和button1,当我们把这个web控件拖动到一个网页上时就会显示这两个控件,你多放上几个此种控件,你再看下html客户端源码,你会发现它和服务端的id是不一样的,这就是clientID.
因此如果要在客户端通过Js,jQuery,Dom的getElementById,$("#id")来操作控件的话最好不要直接写服务端ID,而是这样写:$("#<%=txt1.ClientID%")等.
(2) Visible属性,控件是否可见。如果Visible=False是不会被渲染到HTML客户端的,这和在HTML中style.display=none的效果是不一样的。 如果用HTML的display效果,你在运行进查看网页的源码,就会发现在html中可以看到这些元素,而如果用服务端控件的visible为false,则在网页的源码中是看不到这个元素的,即在客户端这个元素并不存在。只有为Ttrue时才会出现在客户端。
(3) CssClass属性:控件的样式名,其实就是HTML控件的class属性。
(4) Attributes:用来设置获取控件的额外属性,和Dom中的setAttribute(),getAttribute()是一样的。
它有几下几个常用的控件:
1.Label控件,Text属性为显示的文本,AssociatedControlID属性用来关联一个控件。如果为空的话会展示为HTML中的span元素。如果指定为一个控件的id,则会展示为一个HTML中的<Label>并且将for属性设置为被关联控件的ClientID.
2. Literal控件,它是展示一段文本,但是Literal控件不会渲染成任何额外的标签,就是将Text属性的值展示出来而已。如
<div><asp:Literal ID="Literal1" runat="server" Text="你好吗你好吗"></asp:Literal></div>
则运行后客户端显示的为
<div>你好吗你好吗</div>
它有个属性Mode的值为Encode,相当于HttpUtility.htmlEncode函数,即可把< >等符号解析为其它的,不会把这些符号当成js中的符号。
3. textBox控件,文本框控件,textMode属性取值SingleLine,MultiLine,Password,分别渲染为input的text,textarea,password.当AutoPostBack属性为True时,用户名焦点离开TextBox就会造成页面的post.实现原理就是TextChanged事件,即文本发生变化时触发。
4. RadioButton控件,渲染为input type=radio.通过Groupname 属性进行分组。
5.Button控件。OnClientClick属性,当用户点击按钮的时候在浏览器端执行的代码,注意OnClientClick是字符串属性,写的就是js代码,运行在浏览器端。
6.LinkButton .用法和Button差不多,区别就是Button控件渲染为按钮,而linkButton渲染为超连接。不要用linkbutton来实现普通的超连接,因为lindbutton的href为一般js代——进行的是表单的post.无法在“新窗口”中打开连接。
7.Imagebutton控件也和button差不多,只不过是显示图像,渲染为input(type=imaeg)
8.Button,linkButton,ImageButton等控件都有CommandName,CommandArgument两处属性和Command事件。可以让多个按钮控件共享一个Command事件处理函数。通过读取事件对象e的CommandName\CommandArgument两个属性读取被点击按钮上设置的这两个参数来执行不同的操作
如实例(在表单上放上一个table,有二条记录,有四个按钮,分别为删除按钮和编辑按钮,各两个):
<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <table border="0" cellspacing="0" cellpadding="0" width="30%"> <tr> <th>名称</th> <th>操作</th> </tr> <tr> <td>tom</td> <td> <asp:Button ID="Button1" runat="server" CommandName="delete" CommandArgument="tom" oncommand="buttonclick" Text="delete" /> <asp:Button ID="Button2" runat="server" CommandName="edit" CommandArgument="tom" Text="edit" oncommand="buttonclick" /> </td> </tr> <tr> <td>jim</td> <td> <asp:Button ID="Button3" runat="server" Text="delete" CommandName="delete" CommandArgument="jim" oncommand="buttonclick" /> <asp:Button ID="Button4" runat="server" Text="edit" CommandName="edit" CommandArgument="jim" oncommand="buttonclick" /> </td> </tr> </table> </div> <asp:Panel ID="Panel1" runat="server" GroupingText="5526"> <asp:Literal ID="Literal1" runat="server" Text="rerwrwerwer"></asp:Literal> </asp:Panel> </form> </body> </html>
如上,已定义了每个按钮的CommandArgument和CommandName,然后写一个共公的buttonclick事件,
protected void buttonclick(object sender, CommandEventArgs e) { if (e.CommandName == "delete" && e.CommandArgument == "tom") Response.Write("tom deleted.<br />"); else if (e.CommandName == "edit" && e.CommandArgument == "tom") Response.Write("tom edited.<br />"); else if (e.CommandName=="delete" && e.CommandArgument=="jim") Response.Write("jim deleted.<br />"); else if (e.CommandName == "edit" && e.CommandArgument == "jim") Response.Write("jim edited.<br />"); }
然后把各个按钮的oncommand绑定到buttonclick.
9. Panel控件。 它是用来盛放一些控件,如果设定了GroupText属性,那么就被渲染为<fieldset>标签,也是就GroupBox效果,否则会渲染为<div>效果。
10.HyperLink控件,超连接。和LinkButton不一样,不会向服务器端Post,就是一个超连接。
NavigateUrl:连接地址; Text为显示文本。如果设定imageUrl属性,则会显示图片超连接。
11.FileUpload控件,文件上传的控件。渲染成input( type=file).
它的属性为: FileContent:以流的形式获得上传的文件. FileName:上传的文件名. HasFile:bool.表示用户是否选择文件。 SaveAs:用于将文件保存到磁盘的指定位置。
当然用户可以上传个aspx样的网页然后再运行这个上传后的网页,它可以在网页上写上:Files.deleteAllFile等,就可以把网站上特定目录中的文件都删除,如何防范:可以只允许上传指定类型的文件,并设定上传的文件夹不给执行的权限即可。即WebShell就是专门干这样的坏事的。