×

ASP.NET一些功能、小技巧

Kalet Kalet 发表于2009-03-20 12:00:13 浏览228 评论0

抢沙发发表评论

1、遍历驱动器
Private Sub ShowDrives()
    Dim d() As StringASP.NET一些功能、小技巧
    d = System.IO.Directory.GetLogicalDrives()
    Dim en As System.Collections.IEnumerator
    en = d.GetEnumerator
    While en.MoveNext
      Console.WriteLine(CStr(en.Current))
    End While
  End Sub
 
===========================================================
2、多关键字查询
dim strsql as string
if strkeyword="" then
  strsql="select * from users"
else
  strsql="select * from users"
  dim arrykeyword() as string
  dim i as integer
  arrkeyword=splite(strkeyword," ")  '按空格拆分成数组
  strsql &= " where name like '%" & arrykeyword(0) & "%'   '添加第一个关键词
  for i=1 to arrykeyword.length-1
    strsql &= " and name like '%" & arrykeyword(i) & "%'"  'and前留一个空格
  next
end if
 
===========================================================
3、级联更新
       ConnString = New SqlClient.SqlConnection
        ConnString.ConnectionString = (xinxi.stringconnection)
        Dim strSQL As String = "select id,dizhi,youbian from youbian"
        Dim objCmd As New SqlClient.SqlDataAdapter(strSQL, ConnString)
        Dim DS As New DataSet
        objCmd.Fill(DS, "youbian")
        Dim i, j
        For i = 0 To DS.Tables("youbian").Rows.Count - 1
            DS.Tables("youbian").Rows(i).BeginEdit()
            DS.Tables("youbian").Rows(i)(1) = "133331"
            DS.Tables("youbian").Rows(i)(2) = "144441"
            DS.Tables("youbian").Rows(i).EndEdit()
            Dim myTable As DataTable = DS.Tables("youbian")
            Dim oCbd As New SqlClient.SqlCommandBuilder(objCmd)
            objCmd.Update(DS.GetChanges, "youbian")
            DS.AcceptChanges()
        Next
        BindList()
 
===========================================================
4、防刷新计数器


要在这个ASP文件下新建一个counter.txt文件,用于存放记数值


  Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
MyBase.Load
        If Session("counter") = "" Then
            Session("counter") = counts("counter.txt").ToString
        End If
    End Sub
    Function counts(ByVal counterfile)
        Dim objfso, objts
        Application.Lock() '锁定对象
        objfso = Server.CreateObject("scripting.filesystemobject")
        objts = objfso.opentextfile(Server.MapPath(counterfile), 1, True)
        If Not objts.atendofstream Then '检查是否到达文件结尾
            counts = CLng(objts.readline)
        End If
        counts = counts + 1
        objts.close()
        objts = objfso.opentextfile(Server.MapPath(counterfile), 2, True)
        objts.writeline(counts)
        objts.close()
        Application.UnLock() '解除锁定
    End Function
 


===========================================================
5、文件下载
参数说明
AbsPath:文件绝对路径
FileName:文件原名
public static void DownloadFile(string AbsPath,string FileName)
{
FileStream fs = new FileStream(AbsPath, FileMode.Open, FileAccess.Read);
BinaryReader r = new BinaryReader(fs);
System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;
filename="+FileName);
// System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition",
"attachment;FileName");
System.Web.HttpContext.Current.Response.Charset = "GB2312";
System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream";
System.Web.HttpContext.Current.Response.BinaryWrite(r.ReadBytes(Convert.ToInt32(fs.Length)));
System.Web.HttpContext.Current.Response.Flush() ;
}
 
 
===========================================================
6、后台正则
Imports System.Text.RegularExpressions
If Regex.IsMatch(Text2.Value, "http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?") Then
 
 
===========================================================
7、页面传值
在B页面(子窗)里用这个:
Response.Write("<script language=javascript>window.opener.MyForm." & Request("TheControl") &
".value='" & Thestr & "'</script>")
'这个是把 Thestr 的值传给父窗A页面的 TheControl 控件
 
这个是传值后关闭B页面的,也就是子页面,如不关的话可以去掉,也是写在B页面(子窗)的
Response.Write("<script language=javascript>window.close();</script>")
 


===========================================================
8、在 ASP.NET 中使用计时器(Timer)


我在实验中发现在 ASP.NET 中可以使用计时器(Timer)完成一些定时动作。这一点可能会对我们的一些 Web
程序有益。
下面首先介绍我测试使用的一个例子:
首先在 global.asax 中的 Application_OnStart 事件过程中定义计时器,代码如下:
[VB.NET] global.asax
<%@ import Namespace="System.Timers" %>
<script runat="server">
   Sub Application_OnStart(sender As Object, e As EventArgs)
       ' 创建一个计时器,单位:毫秒
       Dim aTimer As New System.Timers.Timer(10000)
       ' 将 Fresher 指定为计时器的 Elapsed 事件处理程序
       AddHandler aTimer.Elapsed, AddressOf Fresher
       ' AutoReset 属性为 true 时,每隔指定时间循环一次;
       ' 如果为 false,则只执行一次。
       aTimer.AutoReset = True
       aTimer.Enabled = True
        
       ' 先给 Application("TimeStamp") 指定一个初值
       Application.Lock()
       Application("TimeStamp") = DateTime.Now.ToString()
       Application.UnLock()
   End Sub
   Sub Fresher(sender As Object, e As ElapsedEventArgs)
       Application.Lock()
       Application("TimeStamp") = DateTime.Now.ToString()
       Application.UnLock()
   End Sub
</script>
 
然后我们简单写一个 test.aspx 来查看 Application("TimeStamp") 的值。代码如下:
[VB.NET] test.aspx
<%
    Response.Write(Application("TimeStamp"))
%>
 
分析:
根据 global.asax 中的代码,我们设定了一个计时器,每隔 10 秒钟执行一次 Fresher() 过程;在
Fresher() 过程中我们事实上只是重新写入了一个 Application("TimeStamp") 新值。换句话说,
Application("TimeStamp") 的值是应该每隔 10 秒钟更新一次的。
是不是这样的呢?通过 test.aspx 的反复刷新观察 Application("TimeStamp") 的值,的确发现这个值在每
隔 10 秒地变化一次,而其他时候则保持不变。与我们的预期是一致的。
意义:
通过引入计时器我们可以在 ASP.NET 的全局性程序(Application)中灵活的使用计时器完成一些定时操作,
比如:在社区/论坛系统中,每隔 5 分钟更新一次在线用户列表,每隔 1 个小时更新一次用户经验值,或者
每隔一天备份一次关键数据等等。这个思路应该是很诱人的。
 
 
===========================================================
9、在线统计


当有一个会话发生时(用户浏览网页,向Web服务器发出请求)那么,如果自服务器启动后第一个用户的话,
就会同时发生Application_OnStard和Session_OnStart这两个事件,之后,再有别的用户发出请求的话,就只
发生Session_OnStart这个事件,而session的生存期是多长,是可以设定的,Session.timeout=X(分钟)
  好了,有了这个很好用的方法,我们就能准确地统计出在线人数了,而人数总计是用一个application变
量来保存,当在第一个会话开始时,在Application_OnStard事件中放置一条清空计数器的语句application
("online")=0,然后,在Session_OnStart事件中,放置一条增加在线人数的语句application("online")
=application("online")+1,而在Session_OnEnd事件相应地放一条减少在线人数的语句,令计数值减一。
  这样,这个文件就改为如下
<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
Sub Session_OnStart
application.lock
application("online")=application("online")+1
application.unlock()
End Sub
Sub Session_OnEnd
application.lock
application("online")=application("online")-1
application.unlock()
End Sub
sub Application_OnStard
application("online")=0
End Sub
sub Application_OnEnd
application("online")=0


End Sub</SCRIPT>
  
上面的程序很简单,这里不作分析了,请大家自己阅读一下。在调用在线统计的页面上
label1.text=application("online")


以上的统计,简明扼要,程序很容易实现。但是,如果我们仔细考虑,发现该方法有一定的局限,统计出来的
在线用户数量可能稍微有点误差。因为我们在以上程序中,是根据用户建立和退出会话(Session)来实现在
线人数的加减的,而我们知道,如果用户没有关闭浏览器,而进入另外一个网站,那么,这个会话在一定的时
间内是不会结束的,这个时间我们可以通过TimeOut来设置,一般的,我们设置为20分钟。所以,在用户数量
统计上面,还是存在一点误差的。
  另外,我们知道,在ASP中,如果用户将浏览器上面的Cookies设置为“禁用”,那么,Session就不能再
被传递,显然,这样设置让以上的统计程序无能为力。不过,在ASP.NET中我们有解决方法,在config.web文
件中,我们将<sessionstate cookieless="false" />设置为true就可以了,也就说,不使用Cookies也可以
传递Session。这样,我们的程序就可以在不同的访问者环境中顺利运行。
 


===========================================================
10、多余内容用“...”显示


问题:
  用<%# DataBinder.Eval(Container.DataItem,"NewsID")%>显示数据的,如果标题太长了怎么规定字数
,多余的用"..."代替
解决方法:
1.使用后台代码解决:
 Public   Function   substring(ByVal   s   As   String)   As   String  
       If   s.Length>25   Then  
            Return   s.Substring(0, 25) + "...."  
        Else  
            Return   s  
        End   If  
 End   Function


前台ASPX调用的代码:
<asp:TemplateColumn>
            
<ItemTemplate>
            
 <asp:Label   id="TBX_TMP" runat="server" text='<%# substring(DataBinder.Eval
(Container.DataItem,"neirong"))%>' tooltip='<%#DataBinder.Eval(Container.DataItem,"neirong")%>'
>
            
 </asp:Label>
            
</ItemTemplate>
           
</asp:TemplateColumn>
也就是先处理,后调用绑定
 
3.CSS表示法
  语法:
 
text-overflow : clip | ellipsis
 
参数:
 
clip :  不显示省略标记(...),而是简单的裁切
ellipsis :  当对象内文本溢出时显示省略标记(...)
 
说明: ASP.NET一些功能、小技巧
 
设置或检索是否使用一个省略标记(...)标示对象内文本的溢出。
对应的脚本特性为textOverflow。请参阅我编写的其他书目。
 
示例:
 
div { text-overflow : clip; }
4.SQL语句
   在sql语句中用left或substring函数
select left("列明",你要的数字长度) as  要绑定的列名 from  data
然后在前台绑定就ok  substring也是一样


问题:
假如数据库的内容果里面有html的代码呢,
如:
<table>
<tr>
<td>
这是要显示的内容,就是没有办法显示。
</td>
</tr>
</table>
如果我现在用了Substring来做,
如Substring(0,5);
我想要的效果是这样的。--------> 这是要显示...
但是结果是这样的。 -------->  <tabl...


解决方法:
使用正则表达式分出来,再截取
public string StripTags(string text)
{
text = Regex.Replace(text, @"&nbsp;", "", RegexOptions.IgnoreCase);
text = Regex.Replace(text, @"\r\n", "", RegexOptions.IgnoreCase);
return Regex.Replace(text, @"<.+?>", "", RegexOptions.Singleline);
}


tring str = "<table>\r\n<tr>\r\n<td>\r\n这是要显示的内容,就是没有办法显
示。\r\n</td>\r\n</tr>\r\n</table>";
然后调用StripTags("str").SubString(0,5)
就可以得到你要的效果了.
 
 
===========================================================
11、利用CustomValidator来验证textbox的长度.  
 
   
<script language="javascript">
    function ClientValidation(source,value)
    {
        var str = value.Value;
        var len = 0;
        for(var i=0;i<str.length;i++)
        {
            if(str.charCodeAt(i)<128)
                len++;
            else
                len+=2;
        }
        if(len>5)
            value.IsValid = true;
        else
            value.IsValid = false;
    }
</script>
<asp:CustomValidator id="CustomValidator1" ControlToValidate="TextBox2"
ClientValidationFunction="ClientValidation" Runat="server" ErrorMessage="长度6-20
位"></asp:CustomValidator>
 
 
===========================================================
11、在ASP.NET中清空浏览器客户端的缓存
?///
??/// 清空浏览器客户端的缓存
??///
??public static void ClearClientPageCache()
??{
???HttpContext.Current.Response.Buffer=true;
???HttpContext.Current.Response.Expires = 0;
???HttpContext.Current.Response.ExpiresAbsolute=DateTime.Now.AddDays(-1);
???HttpContext.Current.Response.AddHeader("pragma","no-cache");
???HttpContext.Current.Response.AddHeader("cache-control","private");
???HttpContext.Current.Response.CacheControl="no-cache";
??}
===========================================================
12、如何复制一个目录里面的所有目录和文件
 本文介绍如何将一个目录里面的所有文件复制到目标目录里面。
下面介绍几个我们在该例程中将要使用的类:
1、Directory:Exposes static methods for creating, moving, and enumerating through directories and subdirectories.
2、Path:Performs operations on String instances that contain file or directory path information. These operations are performed in a cross-platform manner.
3、File:Provides static methods for the creation, copying, deletion, moving, and opening of files, and aids in the creation of FileStream objects.
        这两个类里都是不可继承的,是从object直接继承来的,被实现成sealed,上面的解释均来自MSDN。
        下面是实现的代码,代码中的细节不在这里详细描述,请看代码注释:
// ======================================================
// 实现一个静态方法将指定文件夹下面的所有内容copy到目标文件夹下面
// ======================================================
public static void CopyDir(string srcPath,string aimPath){
 // 检查目标目录是否以目录分割字符结束如果不是则添加之
 if(aimPath[aimPath.Length-1] != Path.DirectorySeparatorChar)
  aimPath += Path.DirectorySeparatorChar;
 // 判断目标目录是否存在如果不存在则新建之
 if(!Directory.Exists(aimPath)) Directory.CreateDirectory(aimPath);
 // 得到源目录的文件列表,该里面是包含文件以及目录路径的一个数组
 // 如果你指向copy目标文件下面的文件而不包含目录请使用下面的方法
 // string[] fileList = Directory.GetFiles(srcPath);
 string[] fileList = Directory.GetFileSystemEntries(srcPath);
 // 遍历所有的文件和目录
 foreach(string file in fileList){
  // 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件
  if(Directory.Exists(file))
   CopyDir(file,aimPath+Path.GetFileName(file));
  // 否则直接Copy文件
  else
   File.Copy(file,aimPath+Path.GetFileName(file),true);
 }
}
        嘿嘿!这次给大家说的功能比较简单,适合初学者,希望对初学者有所帮助!如果你需要将该功能使用在Web工程中,那么请设置给ASPNET帐号足够的权限,不过这样做是很危险的,不建议这样做。
        有什么疑问或者建议可以发送邮件到:wu_jian830@hotmail.com


===========================================================
13、利用System.IO中的Directory类对目录进行基本操作
 '创建目录
        Directory.CreateDirectory("c:\\Dir_name")


        '删除目录
        Directory.Delete("c:\\Dir_name")
        '或
        Directory.Delete("c:\\Dir_name", False)   '当待删除目录下有文件或子目录时,抛出异常,除非第二个参数为true


        '判断一个目录是否存在
        Response.Write(Directory.Exists("c:\\Dir_name"))


        '取得目录的时间
        Response.Write(Directory.GetCreationTime("c:\\Dir_name"))


        '返回一个目录下的子目录
        Dim f1 As String()
        f1 = Directory.GetDirectories("c:\\")
        '也可写为f1=Directory.GetDirectories("c:\\","w*.*")        
        '既使用通配符为条件过滤本例是返回以w开头的目录


        '输出
        Dim i As Integer
        For i = 0 To f1.GetLength(0) - 1
            Response.Write(f1.GetValue(i))
            Response.Write("<br>")               '换行
        Next


        '返回一个目录下的文件
        f1 = Directory.GetFiles("c:\\")
        '也可写为f1=Directory.GetFiles("c:\\","w*.*");        
        '既使用通配符为条件过滤本例是返回以w开头的文件
        '输出
        For i = 0 To f1.GetLength(0) - 1
            Response.Write(f1.GetValue(i))
            Response.Write("<br>")               '换行
        Next
 
===========================================================
14、利用DataGrid显示某目录下的所有文件
.NET Framework提供两个访问目录信息的类和两个访问文件信息的类,钥访问目录,可以使用Directory类,也可以使用DirectoryInfo类,对应于文件,也有File类和FileInfo类。这两个类之间的区别在于返回的信息和使用的方法不同。Directory和File类属于静态类,在使用时你不必创建实例,例如:要删除文件,可以File.Delete(filePath),要检测文件夹是否存在可以Directory.Exists(directoryPath)。而带Info的类在使用时必须先进行实例化,并在构造函数里指名文件名字或者目录名字,因此,删除文件可以用Dim myFile as File = New File(filePath),myFile.Delete()。
这两个类都提供了得到一个文件夹下的所有文件或者某种扩展名的文件的方法,即GetFiles()。
' --- Directory 例子 ---- Dim files()



as String = Directory.GetFiles(directoryPath[, optionalWildCard])
' --- DirectoryInfo 例子 ----



Dim myDir as DirectoryInfo = New DirectoryInfo(directoryPath)



Dim fileInfos() as FileInfo = myDir.GetFiles([optionalWildCard])
值得注意的是,两者返回的类型是不同的,一个是String类型的数组,另外一个是FileInfo类型的数组。
下面就是绑定的方法:
VB.NET


 <%@ Import Namespace="System.IO" %>
<script language="VB" runat="server">
Sub Page_Load(sender as Object, e as EventArgs)
Dim dirInfo as New DirectoryInfo(Server.MapPath(""))
articleList.DataSource = dirInfo.GetFiles("*.aspx")
articleList.DataBind()
End Sub
</script>
<asp:DataGrid runat="server" id="articleList" Font-Name="Verdana" AutoGenerateColumns="False" AlternatingItemStyle-BackColor="#eeeeee" HeaderStyle-BackColor="Navy" HeaderStyle-ForeColor="White" HeaderStyle-Font-Size="15pt" HeaderStyle-Font-Bold="True">
<columns>
<asp:HyperLinkColumn DataNavigateUrlField="Name" DataTextField="Name" HeaderText="文件名" />
<asp:BoundColumn DataField="LastWriteTime" HeaderText="最后修改时间" ItemStyle-HorizontalAlign="Center" DataFormatString="{0:d}" />
 <asp:BoundColumn DataField="Length" HeaderText="文件大小" ItemStyle-HorizontalAlign="Right" DataFormatString="{0:#,### 字节}" />
</columns>
</asp:DataGrid> 


 



 
 
 
===========================================================
15、操作文件系统
(1)操作文件系统
 Imports System.IO
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim sw As StreamWriter
        '调用File类的CreateText方法返回一个StreamWriter 在创建StreamWriter 之后,可以调用它的Write方法将文本写到文件中
        sw = File.CreateText(MapPath("ok.txt"))
        sw.WriteLine(TextBox1.Text)
        sw.Close()
    End Sub
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        '读文本
        Dim sr As StreamReader
        '判断路径下文件是否存在
        If (File.Exists(MapPath("ok.txt"))) Then
            sr = File.OpenText(MapPath("ok.txt"))
            TextBox1.Text = sr.ReadLine()
        Else
            TextBox1.Text = "文件不存在!"
        End If
    End Sub
(2)二进制文件的建、写、读
     '写二进制文件
        Dim bw As BinaryWriter
        '创建一个二进制文件
        Dim fs As FileStream = New FileStream(MapPath("mydata.data"), FileMode.Create)
        bw = New BinaryWriter(fs) '初始化一个BinaryWriter
        Dim i As Integer
        For i = 0 To 199
            bw.Write(i) '写入
        Next
        bw.Close() '关闭
    End Sub
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        '读二进制文件
        Dim br As BinaryReader
        Dim Str As String = ""
        Dim fs As FileStream = New FileStream(MapPath("mydata.data"), FileMode.Open)
        br = New BinaryReader(fs)
        Dim i As Integer
        For i = 0 To fs.Length / 4 - 1
            Str += br.ReadInt32().ToString()
        Next
        TextBox1.Text = Str
    End Sub
(3)显示目录内容
  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim str As String = TextBox2.Text
        ' DataGrid1.DataSource =Directory.GetFiles (str)
        DataGrid1.DataSource = Directory.GetFiles(str, "*.aspx") '获取目录下.aspx后缀的文件列表
        DataGrid1.DataBind()
    End SubASP.NET一些功能、小技巧
该文章转载自网络大本营:http://www.xrss.cn/Info/14774.Html



群贤毕至

访客