1 <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl = "/b.htm" Text =
"cel">HyperLink</asp:HyperLink>
<asp:HyperLink ID="HyperLink2" runat="server" NavigateUrl = "~/b.htm" Text =
"cel">HyperLink</asp:HyperLink>
这段代码: ~/b.htm 是相对于当前应用开始的路径。而 /b.htm是相对于域名开始的。
推荐使用第二种写法。这种特殊写法只能在服务器端控件才能使用。普通的控件是无法使用这种特殊写法的。
2 VirtualPathUtility.ToAbsolute("~/a.aspx")
这个方法可以把这种特殊的写法转化为相对于当前工作区的全路径。
3 Response.Write(Request.AppRelativeCurrentExecutionFilePath);
返回当前页面相对当前工作区的虚拟路径: ~/a.htm的形式。
4 Response.Write(Request.PhysicalApplicationPath);
返回相对于电脑的物理路径。
5 Request.urlreferrer 防止盗链的行为。
6 Request.userhostaddress 可以获取当前访问者的 ID,用这个方法可以做到粗略定位访问者的效果,也可以做到屏蔽访问者的作用。
7 Server.mappath 和request.mappath 这两个方法将文件的虚拟路径转化为物理路径。
8 为了提高服务器的性能, asp.net向浏览器write的时候默认并不会每write一次,就立即输出到浏览器中,
而是会缓存数据。到合适的实际或者相应结束才会将缓存区中的数据一起发送到浏览器。
9 Respose.Buffer Response.BufferOutput: 经过Reflector反编译,发现两个属性是一样的, Buffer内部就是调用了BufferOutput。这个属性来控制是否采用响应缓存。默认 true。
Response.flush() 将缓存区中的数据发送给浏览器。这在需要将 Write出来的内容立即输出到浏览器的场合非常使用。案例:大批量数据的导入,显示正在导入第几条数据。用 thread sleep 模拟耗时。
10 Response.clear() 清空缓存区中的数据。这样在缓存区中的没有发送到浏览器段的数据被清空,不会发送给浏览器。
System.Threading.Thread.Sleep(500);
context.Response.Write(" 第" + i + "步已完成");
context.Response.Flush();
这段程序说明了 flush()方法的用法。可以显示现在网络在执行什么。
12 Response.Cookies 返回给浏览器的 Cookie的集合,可以通过它设置 Cookie。
13 Response.OutputStream 输出流,在输出图片, EXCEL文件等非文本内同的时候使用它。
14 Response.End() 终止响应,将之前缓存中的数据发给浏览器, End()之后的代码不会被继续执行,在终止一些非法请求的时候会使用到。比如盗链等可以用 End()立即终止请求。
16 Response.Response.Redrect 是向浏览器发送 302重定向。是通知浏览器请重新访问 url这个网站。 Redrest转链接地址时,地址栏的地址也会随着变化而变化。
17 Response.WriteFile(“filename”) 向浏览器输出文件,比如 Response.WriteFile(“C/boot.ini”);
18 Server.Transfer(path) 内部重定向请求, Server.Transfer(“jieBanRen.aspx”); 将用户的请求重定向给该网站处理,是服务器内部的接管,浏览器是意识不到这个接管的,不是象 Response.Redirect那样,经历了浏览器“重新访问 url这个网址”。
严重注意: Transfer是内部接管,因此不能像 Redirect那样重定向到外部网站。
使用 Server.transfer不能直接重定向到ashx,否则会报错“执行请求错误”。
Transfer浏览器只执行一次请求。 Redirect是多次请求。
Transfer传输过程,在新页面中可以获得元页面的 cookies和session等。
19 有时候不能拿到 HttpContext对象,可以通过HttpContext.Current拿到当期的HttpContext,进而拿到
Response Request Server 等。
context.Response.ContentType = "img/jpeg";
context.Response.AddHeader("content-Disposition", " 截图.jpg");
这段代码的意思是:告诉浏览器,不要以一般形式显示该文件,实现了下载功能。
context.Response.WriteFile("20130415205833.png");
20 cs可以调用aspx中的控件,aspx中也可以访问 cs中定义的字段,函数,还可以编写复杂的 C#代码,for等所有 C#代码都可以卸载aspx中。
前面 <%=UserName%>
表示在当前位置输出表达式的值的时候使用 <%=UserName%>,不要丢了 =,相当于在当前位置调用Response.Write(UserName);
使用的函数,代码相当于在这个位置调用函数,执行代码。注意 aspx中调用的cs的成员级别必须是protection或者public ,不能是 private级别的。
<%SayHello();%> <%if(UserName == “aaa”){UserName = “bbb”;}>
21 FindControl(child), 根据控件的 id来找到控件,一般情况下是不这样用的。但是对于有些场合,使用 Listview等控件的模版,编写自定义控件等则需要使用 findControl来引用控件。FindControl返回值是control,一般需要显性转化为相应的控件。
$(function () {
$('# <%=TextBox1.ClientID %>').mousemove(function () {
$('# <%=TextBox1.ClientID %>').css("backgroundColor", "red");
})
})
这段代码说明了控件 .ClientID的用法,用于获取当前服务器端控件在页面中的 ID。
22 Label控件,Text属性为显示文本, AssociatedControlID属性用来关联一个控件,如果为空的话,会显示一个 Span,如果制定为一个控件的ID,则会展示一个HTML中<Labek> 并且for属性设置为被关联控件的ClientID。
23 在表单提交的时候,一般都调用 asp.net自动生成的方法:doPostBack方法,而不去调用from.submit()
24 RadioButton 控件,渲染成 input(type = radio),通过GroupName属性,进行分组。
Button控件。OnClientClick属性,当用户点击按钮的时候,在浏览器端执行的代码,注意 OnClientClick是字符串属性,写的代码是 javaScript代码,运行在浏览器端, <asp:Button ID = “btnDel” runat = “server ” onclientclick = “return confirm(?真的要删除么??)”>
25 Button LinkButton imageButton 等控件都有 CommandName CommandArgument 两个属性
和 Command事件,可以让多个按钮控件共享一个 CommandArgument事件处理函数,通过读取事件对象 e的CommandName ComandArdument 两个属性读取被点击按钮上设置的两个参数来执行不同的操作 。
26 Hyperlink 标签的好处在于可以快速的引用站内资源。
string path = Server.MapPath("file");
Response.Write(path + @"\" + FileUpload1.FileName);
if (FileUpload1.HasFile)
{
FileUpload1.SaveAs(path + @"\"+FileUpload1.FileName);
}
本端代码演示了 fileupload 的使用方法,SaveAs()方法用于将用户选择的文件保存,注意这里使用的是文件夹的全路径。使用前,先转化一下。注意:该控件在谷歌浏览器中有异常。
27 HTML控件,ASP.net把 HTML控件当成普通字符串渲染到浏览器端,不去检查正确性,无法在服务器端进行处理。
Asp.net服务器端控件,经过asp.net高度封装的控件,使用简单,运行在服务端,可以在服务端使用 C#代码进行操作,会渲染到客户端为 HTML控件。
Runat = server 的HTML控件,在html控件的基础上添加 runat = “server” ,也是运行在服务器端的,也可以服务端使用 C#代码进行操作,也会渲染到客户端,不像 asp.net服务端控件那样高度封装,暴露的属性大部分是普通 HTML属性。
和 asp.net服务端控件相比,好处是:当需要在服务器端要对控件进行操作的时候,如果控件没有被 asp.net服务端控件封装的时候,用 runat = server的HTML控件比较方便, runat = server的HTML控件也会对虚拟路径, id ClientID进行处理,所以在使用虚拟路径, UserControl中也可以会用到。
不同的 HTML标签runat = “server”后,可以操作的属性是不同的。普通 <a>标签,可以在服务器端操作 href等特有的属性。
Asp.net控件的脚本内联。要写在外面。因为 asp.net控件经过了高度封装,所以写在控件内的脚本会直接被渲染成文本形式,而不被解析。
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Button" />
<script type = "text/javascript">
document.getElementById(" <%=Button1.ClientID%>").onmouseover = function () { document.getElementById(" <%=TextBox1.ClientID %>").value = "哈哈";
};
</script>
28 Asp.net为我们提供了一些校验控件,用于解决重复的校验步骤。
RequiredFieldValidator: 字段必填。
RangeValidator :值在给定的最大值,最小值之间。
CompareValidator :用于比较两个值的关系是否满足要求或者是否是制定类型的数据。
RequiredFieldValidator: 常用属性: ControlToValidate 用于设定校验那一个控件。 ErrorMessage 用于设定报错信息。 initialValue用于设定初始值校验。
强烈注意一件事情:
If (this.isvalid){………} 这个属性用于标识客户端和服务器端校验是否全部通过。
为了防止跳过客户端校验后,因为如果跳过了客户端校验,哪怕服务器端没有校验通过,也会执行控件绑定的相应的方法。 IsValid表示页面中所有Valiable是否都校验成功。
所有的验证控件都有 Display属性,用来决定如何显示错误信息。三个值: Static :没有错误信息的时候控件的 visibility样式为hidden来实现隐藏, Dynamic:没有错误信息的时候控件的 display样式none来隐藏。
如果在一个页面中同时放置注册和登录表单,那么他们的验证就会同时进行,这样虽然只是登录,但是注册的验证也会被触发,可以使用验证组来解决这个问题,将同一组的控件(表单,提交按钮, validator等)的ValidationGroup设为同样的就可以了。这样的话和 Button等触发事件的控件的ValidationGroup相同控件会校验。
RequiredFieldValidator RangeValidator CompareValidator 这三个控件特点:如果被校验的控件为空,是无法触发这些事件的。必须再加一个非空校验器来校验。
CompareValidator : Type属性同RangeValidator 。
Operator属性,比较操作符,可选值: DataTypeCheck(比较类型) Equal GreaterThan GreaterThanEqul LessTHan LessThanEqual
ControlToCompare : 设定于另外一个控件进行比较。
ValueToCompare : 所比较的运算符右边的值。
29 网站的布局通常是统一的,上面是 Logo,菜单条,下面是公司的地址,版权声明等。如果每个页面都要重复这些功能的话;重复性劳动,一旦修改那么每个页面都要修改。可以使用 FrameSet(框架集)技术来解决,但是 FrameSet技术不灵活,而且很难进行 SEO,所以只有部分内网系统还在用 FrameSet,.net中一般用母板技术来解决这个问题。
MasterPage 是这样一种技术,把页面布局画好,在变化的内容部分留空,留空的部分由子页面填充内容,这样子页面只要天空就行,不用重复设计页面结构,一旦要修改页面结构修改母版页就可以了,这样所有页面都会变化,母版页“挖坑”,具体页面“填坑”。母版页,具体页面中几乎可以使用所有普通 WebForm页面使用的技术。
添加“母版页”, <ContentPlaceHolder>中的内容就是子页面需要填充的内容。
如果是 WebSite使用母版页:新建一个webForm 然后勾选使用母版页。如果是WebApplation:是新建Web内容页。
脚本内容和 CSS内容应写在第一个“坑”里面。如下:
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> <asp:Button ID="Button1" runat="server" Text="Button" />
<script type = "text/javascript">
var btn1 = document.getElementById("<%=Button1.ClientID %>" );
btn1.onmouseover = function () {
btn1.style.backgroundColor = "red";
}
</script>
</asp:Content >
在母版页中,引用的一些资源可能会有路径问题。解决方案有两种,一种是用服务器端控件,自动解析,但是耗资源太多。另一种是普通 HTML标签形式,用ResolveClientUrl方法来解析资源的虚拟路径。 <asp:Image ID="Image1" runat="server" ImageUrl ="~/file/20130420110232.png" /> <img src = "<%= ResolveClientUrl("~/file/20130420110232.png") %>" />
数据绑定:
方法 1:先新建一个数据集,然后在页面上添加一个 ObjectDataSource控件,设定ObjectDataSource控件的数据源,为新建的那个数据集。准备工作完成。其他数据显示控件连接这 ObjectDataSource控件即可。 方法 2:代码绑定,先制定控件的 DataScourse,然后调用DataBing()方法,进行数据绑定工作。
补充:设置 dropDownlist控件的appandDataBing属性为 true,可以实现添加默认项的功能。
复杂数据绑定控件:
Repeater控件: 用 ItemTemplate来控制一行数据的显示模版。如下:
<asp:Repeater ID="Repeater1" runat="server" DataSourceID ="ObjectDataSource1"> <ItemTemplate>
主键:<%#Eval( "Id") %> 书名: <%#Eval("bookname" )%> 书籍类
别:<%#Eval("bookclass" ) %> 数量:<%#Eval("count" ) %>
</ItemTemplate>
</asp:Repeater >
这段代码中: <%#Eval(“count”)%> 代表本行显示表中的哪一列。 注意:Eval()函数前面是 #。 模版中还可以如下写法:
主键: <%#Eval( "Id") %> 书名:<%# Eval("bookname") %> 书籍类别: <%# Eval("bookclass") %> 数量:<input type ="text" value = "<%#Eval("count") %>"/> (也就是说数据也可以显示在 textbox中)。
AlternatingItemTemplate 模版用于设定各行显示的样式,例如:
<AlternatingItemTemplate>
<div style = "background-color :Red">主键:<%# Eval("Id") %> 书名:
<%#Eval( "bookname")%> 书籍类别 :<%# Eval("bookclass") %> 数
量:<input type ="text" value = "<% #Eval("count") %> "/> </div >
</AlternatingItemTemplate>
该模版提供了两行数据中添加额外信息的方法
<SeparatorTemplate><hr /></SeparatorTemplate>
该模版提供了在reaper控件的头部添加信息的方法:
<HeaderTemplate>这是头 </HeaderTemplate>
该模版提供了在reaper控件的尾部添加信息的方法:
<FooterTemplate>这是尾部 </FooterTemplate>
应用案例 1:
用表格的形式显示图书名称和图书详细信息,并添加预览图片。切记:数据库中保存的只是图片的路径而已,通过路径去找到图片,然后加载到页面上。
<asp:Repeater ID="Repeater2" runat="server" DataSourceID ="ObjectDataSource1"> <HeaderTemplate><table style = " border : 1px solid blue"></ HeaderTemplate>
<FooterTemplate></table ></FooterTemplate>
<ItemTemplate><tr >
<td><% #Eval("bookname") %></td >
<td><% #Eval("bookclass") %></td >
<td><% #Eval("count") %></td >
<td><img src = '../imgs/<%# Eval("yulan") %>' /></td>
<td><% #Eval("yulan") %></td >
</tr></ItemTemplate >
</asp:Repeater >
这段代码演示了怎么添加一个完整的表格,分别在“头模版”“尾模版”中添加 <table>,每一行添加<tr><td>
防止用户注入漏洞攻击,使用参数化查询。
登录范例:
///实例化一个SqlParameter数组
SqlParameter[] values = new SqlParameter[] { new SqlParameter ("@username",
TextBox1.Text.Trim())};
CommandType ComType = CommandType .Text;
string querysql = "select * from T_User where UserName = @username" ;
SqlDataReader Reader = SQLHelper .ExecuteReader(ComType, querysql, values);
if (Reader.Read())
{
string password = Reader["password" ].ToString().Trim();
if (password == TextBox2.Text)
{
Response.Write( "登录成功" );
}
else
{
Response.Write( "登录失败" );
}
}
else
{
Response.Write( "查无此人" );
}
Reader.Close();
在SQLHelper中添加方法:
public static SqlDataReader ExecuteReader(CommandType comType, string ComText, params SqlParameter
[] paras)
{
SqlCommand com = new SqlCommand();
SqlConnection con = new SqlConnection(connectionstr);
con.Open();
com.Connection = con;
com.CommandText = ComText;
com.CommandType = comType;
if (paras != null )
{
foreach (SqlParameter p in paras)
{
if (p != null )
{
com.Parameters.Add(p);
}
}
}
SqlDataReader Reader = com.ExecuteReader(CommandBehavior .CloseConnection);
com.Parameters.Clear();
return Reader;
}