原理:在生成datalist列时ItemDataBound触发,也就是说每生成一列就触发一次。这个事件的触发要早于itemcommand.  

datalist里面嵌套datalist :

内层控件数据绑定与事件声明在外层的ItemDataBind中实现

private void dlFileType_ItemDataBound(object sender, System.Web.UI.WebControls.DataListItemEventArgs e)

        {

                if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 

            {

                  DataList   dl = null;

                 Label   labTypeID = null;

                

                 dl = (DataList)e.Item.FindControl("dlFileList")

                labTypeID = (Label)e.Item.FindControl("lbFileType");

                string typeID = labTypeID.Text.ToString();

       int iTypeID = Convert.ToInt32(typeID);

    string commandText = "select * from tbfile";

    commandText = commandText + " Where TypeID=" + iTypeID;

    //------------

    string connString = ConfigurationSettings.AppSettings["dsn"];

                 SqlConnection conn = new SqlConnection();

    conn.ConnectionString = connString;

    conn.Open();

    SqlDataAdapter  myCommand = new SqlDataAdapter(commandText,conn);

    DataSet ds = new DataSet();

    myCommand .Fill(ds,"tbFile");

    conn.Close();

    //------------

                 dl.DataSource = ds.Tables["tbFile"];;

                 dl.DataBind();

              }

        }

 

 

 protected void dtdaleibie_ItemDataBound(object sender, DataListItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            DataList temlist = (DataList)e.Item.FindControl("dtxiaoleibie");
            Label lbvist = (Label)e.Item.FindControl("lbvist");
            int id=Convert.ToInt32(lbvist.Text);
            tongyong ty = new tongyong();
            tongyong.selecontent = "*";
            tongyong.table = "YX_ProductClass";
            tongyong.where = "YX_ParentID="+id;
            tongyong.orderby = "order by YX_OrderID,YX_ID asc";
            temlist.DataSource = ty.search();
            temlist.DataBind();
        }
    }

 

 

QQ、MSN、ICQ、Skype等聊天工具在线代码

2006-08-21 19:53

 

 

QQ在线代码

<a target=blank href=http://wpa.qq.com/msgrd?v=1&uin=你的QQ号码><img border="0" src=http://wpa.qq.com/pa?p=1:你的QQ号码:5 alt="点击这里给我发消息"></a>

QQ在线代码生成页,可以选择多款显示的在线图片 http://imis.qq.com/webpresence/code.shtml

 


 

MSN在线代码

<A HREF="http://snind.gotdns.com:8080/message/msn/你的msn用户名">

<IMG SRC="http://snind.gotdns.com:8080/msn/你的msn用户名"

align="absmiddle" border="0" ALT="MSN Online Status Indicator"

onerror="this.onerror=null;this.src='http://osi.hshh.org/msnunknown.gif';"></a>

红色地方可替换自己喜欢的MSN在线图片

 


 

ICQ在线代码
<A HREF="http://osi.hshh.org:8088/message/icq/你的ICQ号码">
<IMG SRC="http://osi.hshh.org:8088/icq/你的ICQ号码"
align="absmiddle" border="0" ALT="ICQ Online Status Indicator"
onerror="this.onerror=null;this.src='http://osi.hshh.org/icqunknown.gif';"></A>
 
Skype在线 ItemDataBound的用法
地址:http://skype.tom.com/products/skypeme.htm
选择喜欢的式样,copy现成代码即可!
文章引用自:

 

 

 

  在GTalk列表里添加 gtalkonlinestatus@gmai... 

然后在网页中加入
这样就可以在网页中显GTalk的在线状态了。 
移除帐号在线状态显示,可打开 
gtalkonlinestatus@gmai... 对话框,输入 unsubscribe 。 

 

 

 


 

 


 

 

 

 

 

 

网页中嵌入外部页面的四种方法

一.应用框架技术
---- 要在宿主页面中嵌入外部页面的方法是,在宿主页面中包含外部页面的位置插入“< IFRAME name="XXX" width=X height=X frameborder=0 src="XXX.htm" >< /IFRAME >”语句即可(注意: < IFRAME >标签中的各种属性含义请查阅相关技术手册)。

---- 如果想在嵌入的外部页面过长时不出现滚动条,在外部文件< body >标签中加入“scroll=no”或者在宿主页面< IFRAME >标签中加入“scrolling=no”即可。

---- 但这样做会出现一个问题,就是宿主页面和外部页面背景色不同,这样会给人造成页面不是一个整体的感觉。这时,只要在引入的外部文件中使用和宿主页面相同的背景色就可以解决这一问题。注意,如果您使用的是IE 5.5或以上版本的话,直接在标签< IFRAME >内设置属性allowTransparency="true"(即框架背景透明)即可。

---- 在应用框架技术时,为什么不使用框架页面(即< FRAMESET >)呢?现在有很多网站是通过使用框架页面来分割版面的,并达到了统一网站整体风格的目的,但笔者的体会是框架页面的操作灵活性较差,不像内建框架(即< IFRAME >)这样可以在宿主页面中的任何位置插入。

二.使用Scriptlets组件技术

---- 应用这种技术的方法是在宿主页面中包含外部页面的位置插入“< OBJECT style="border: 0px" type="text/x-scriptlet" data="XXX.htm" width=X Height=X >< /OBJECT >”语句即可(注意: < OBJECT >标签中的各种属性含义请查阅相关技术手册)。

---- 在IE 5.0及以后版本中,scriptlets和Html组件(HTCs)被重新命名为Windows脚本编程组件(WSC),其特点类似于上文所讲的框架技术。它有自己的不透明方形区域,并覆盖在宿主页面上,因此不能很平滑地用于具有纹理背景的宿主页面中,其工作方式类似于ActiveX控件,具有自己独立的事件、方法和属性。

三.使用脚本文件技术

---- 我们知道document.write方法可以在宿主页面中输出内容,这样就可以通过在宿主页面中引入外部脚本文件来达到嵌入外部页面的目的。方法是在宿主页面中包含外部页面的位置插入“< SCRIPT language="javascript" src="import.js" >< /SCRIPT >”,然后对外部页面进行改造,将每一行内容写入document.write中,并另外保存在扩展名为js的新文件中。

---- 这种方法的特点是外部页面不具有自己的方形区域,和宿主页面浑然一体,但由于外部页面内容全部写在脚本中,无法做到所见即所得,必须等到脚本运行时才能看到实际效果,这样就为修改调试增加了困难。

四.使用内置行为技术

---- 在IE 5.0及以后版本,引入了一项被称为“DHTML行为”的新功能,并在其中内置了许多默认行为。当将一种行为应用于宿主页面上的标准HTML元素时,它可以增强该元素的默认功能,并提供该行为中定义的任何新方法、属性或事件。其实大家对行为技术并不陌生,微电脑世界2001年18期的《主页加入收藏设置面面观》一文就提到了利用IE中内置的homepage行为技术进行主页设置的方法。我们同样可以利用IE 5.0内置的download行为,来达到在宿主页面中嵌入外部页面的目的,其代码如下。

<span />
<script>
function onDownloadDone(downDate){
outHTML.innerHTML=downDate
}
ieDownload.startDownload('../static/article.htm',onDownloadDone)
</script>

---- 其原理就是使用download行为提供的startDownload方法下载一个外部文本文件,并将文件中的文本内容作为参数传递给onDownloadDone函数,然后再由该函数对文本内容进行处理,在本例中是作为showImport对象的内容显示出来。如果在函数中对文本内容做相应的处理,并与相关技术结合,如XML,就可以实现更为复杂的功能。

---- 这种方法使得外部页面不再具有自己的方形区域,和宿主页面浑然一体; 提供了更大的灵活性,通过使用对象的innerHtml属性可以真正做到在宿主页面的任何位置插入外部文件内容; 修改简单,只须用可视网页编辑软件(如FrontPage 2000)将外部页面修改即可轻松改变网站整体风格。可以说这是在宿主页面中嵌入外部页面的最好方法 (注: 以上代码在Windows 98 SE/IE 5.0中测试通过)。

 

 

网页设计特效实用代码
2007-10-18 17:16

 

在线制作icon图标
http://www.chami.com/html-kit/services/favicon/

进入主页以后自动播放声音
<embed src="http://你的网站/music.rm" hidden=true autostart=true loop=true>

进入主页后自动最大话,省的去在自己单击了
<script>
self.moveTo(0,0)
self.resizeTo(screen.availWidth,screen.availHeight)
</script>

显示现在时间的脚本
<script language=vbscript>document.write now</script>

显示最后修改时间的脚本
<script>document.write(document.lastModified)</script>

设为首页,加为收藏,加入频道,启动outlook发信
<a style="cursor:hand" 
onclick="this.style.behavior="url(#default#homepage)";
this.setHomePage("yourURL">设为首页</a>

<a style="cursor:hand"
onclick="window.external.AddFavorite(location.href,document.title);">加入收藏</a>

<a href=javascript:window.external.addChannel("typhoon.cdf")>加入频道</a>

<a href="youEmail">与我联系</a>

Flash中在按钮上如何加“设为首页”“加入收藏”?action怎么写啊?
on (release) {
getURL("javascript:void(document.links[0].style.behavior='url(#default#homepage)');void document.links[0].setHomePage('84design.com/" target="_blank">http://www.84design.com/&#39;);", "_self");
}

加入收藏:
on(release) {
getURL("javascript:window.external.AddFavorite('84design.com/" target="_blank">http://www.84design.com/&#39;,&#39;E佳工作室&#39;)");
}

状态栏动态显示现在时间
<script>
function see(){
window.setTimeout("see()",1000);
today = new Date();
self.status = today.toString();
}
</script>
<body onload=see()>

关闭窗口的脚本
<a href=javascript:close()>[关闭窗口]</a>

窗口定时关闭
先将如下代码网页文件的<head></head>区:
 <script language="JavaScript">
 function closeit() { setTimeout("self.close()",10000) //毫秒 }
 </script>
然后再在<body></body>标内加入如:<body onload="closeit()">

网页自动关闭
 <html>
 <head>
 <object id=closes type="application/x-oleobject"
 class>文字</a>

在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败。 (provider: SQL 网络接口, error: 26 - 定位指定的服务器/实例时出错)
首 选请确认SQL SERVER EXPRSS已安装到本地计算机上,并且SQL SERVER (SQLEXPRESS)服务已经成功启动。如果问题仍然存在,可以尝试应打开“SQL Server 外围应用配置器”,选择“服务和连接的外围应用配置器”,然后将“远程连接”配置为“同时使用 TCP/IP 和 named pipes”

由于启动用户实例的进程时出错,导致无法生成 SQL Server 的用户实例。该连接将关闭。
将连接字符串中的“User Instance=True”修改为“User Instance=False”即可。

无法将文件 'X:WebsiteApp_DataDatabase.mdf' 作为数据库 ''. 附加。当前命令发生了严重错误。应放弃任何可能产生的结果。
需要为X分区以及X分区的子文件夹和文件分配Users组的“读取”权限。

尝试为文件 X:WebsiteApp_DataDatabase.mdf 附加自动命名的数据库,但失败。已存在同名的数据库,或指定的文件无法打开或位于 UNC 共享目录中。
首 选要确认已经为X分区以及X分区的子文件夹和文件分配了Users组的“读取”权限。如果问题仍然存在,请使用SQL Server Management Studio连接到SQLEXPRESS数据库实例,检查是否有名称是“Database”的数据库存在。如果有,分离同名数据库即可。如果还有问题检查web.config中Data Source=.\SQLEXPRESS,如果同时装了sql2000名称应为MSSQL$SQLEXPRESS。

无法打开用户默认数据库。登录失败。
用户 'NT AUTHORITYNETWORK SERVICE' 登录失败。

数据库文件Database.mdf 的读写权限被设置成只有NETWORK SERVICE才具有。解决方法是先停止掉SQL SERVER (SQLEXPRESS)服务,然后从父项集成权限,再次启动SQL SERVER (SQLEXPRESS)服务即可。

ItemDataBound的用法
 以上是一个简化版本关系图.
User:用户表,存放用户信息
Role:角色表,存放角色信息
UserInRole:用户角色映射表,存放用户和角色的对就关系,多对多,一个用户可以对应多个
角色,而不同的角色有一同的权限。
Permissions:权限表,不同的角色对应不同的权限。权限信息使用一个字段flag来表示,
好处是可以使用位运算来计算权限,缺点是用位标识的权限受理论值限制,如int理论上可以
标识31种不同的权限, 当然可以整加一个字段来弥补,ApplicationID标识不同的模块
Application:模块信息。

  [Flags]
     public enum Flag:long
     {
      View=1,
      Edit=2,
      Delete=4
     }

特性[Flag]告诉编译器,当编译器看到Flag枚举时,它会充许你用|(or)操作符组合枚举值,
就像二的整数幂一样,
例如 Flag  Administer=Flag.View|Flag.Edit|Flag.Delete;表示三种权限的组合。

基础知识:

位运算

枚举Flag

当编译器看到Flag枚举时,它会充许你用|(or)操作符组合枚举值,
就像二的整数幂一样,
例如 Flag Administer=Flag.View|Flag.Edit|Flag.Delete;

常用操作,检查是否存在
Flag administer=Flag.View|Flag.Edit|Flag.Delete;
  public bool Check(Flag administer,Flag mask)
        {
            bool bReturn = false;
            if ((administer & mask) == mask)
                bReturn = true;

            return bReturn;
        }
调用  Check(administer,Flag.Edit)将返回true.

 public Flag SetBit(Flag administer,Flag mask)
        {
          return  administer |= mask;
          
        }

 administer |= mask;操作相当于 administer = administer |mask;

 从枚举中减去一种状态
  administer &=mask;

  如 :
Flag administer=Flag.View|Flag.Edit|Flag.Delete;
如需要禁止删除权限.
 administer &=Flag.Delete;

 另外,标记为flag的枚举类型,可以不设置值
   public enum Flag:long
     {
      View,
      Edit,
      Delete
     }
   如需要设置,按以下规律, View=1,Edit=2,Delete=4,Reply=8按2次方累加,为什么会这样?因为他使用二进制操作,
   当你使用 View=1,Edit=2,Delete=3,Reply=4这样的值, Flag.Delete 包含的值是Flag.Delete还是View=1|Edit=2就无从检测了.

每个用户,可以属于不同的角色不同的角色分配不同的权限,计算所有解权的所有可能的权限组合,只要有充许的权限,那么该用户既获取该权限。

在CS系统中,Permissions表合用了二个字段来标识权限.
 AllowMask,DenyMask 规责是Deny优先,也就是说当权限标记为Deny那么不论是否Allow一律禁止该用户进行此项操作。

另外,像论坛类的权限设计,仅仅一个ApplicationID字段是不够用的,因为每个版块都需要设置不同的权限,来控制权限的粒度,可在增加一张Permission表,ApplicationID修改为版块ID
这样,就可以针对不同的版块设置不同的权限

好了,接下的问题是怎么和.net自带的权限系统挂钩了。。

 

在asp.net系统中 ,HttpContext.Current.User实现了一个接口IPrincipal,IPrincipal包含了另一个接口Identity

  我们在设计User类的时候继承此接口
  public class User:IPrincipal
  {
    string username;
    public string Username
    {
     get{return username;}
     set{username=value;}
    }
  }

  实现IPrincipal接口方法
   public IIdentity Identity
        {
            get {
                if (!string.IsNullOrEmpty(username))
                    _Identity = new GenericIdentity(username,"Forums");
                return (IIdentity)_Identity;
            }
        }

public bool IsInRole(string role)
{
.....
}

怎样和asp.net挂钩呢,这里可以在登陆时做检查

 if(HttpContext.Current!=null){
                User u= Users.GetUser(name);
                HttpContext.Current.User =u;

在使用时 
 User u = HttpContext.Current.User as User;
当然检查用户角色可以直接用

 



 if(HttpContext.Current.User.Identity.IsAuthenticated&&HttpContext.Current.User.IsInRole(角色名))


另外可以直接把到当用户权限策略挂接到当前线程 ,使用以下方法
    AppDomain.CurrentDomain.SetPrincipalPolicy(User);

好了,接下来,怎么check权限?

 

 

 

 

 

 

我倾向于使用Attribute


 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Delegate, Inherited = true, AllowMultiple = true)]
    public class CheckPermissionAttribute : Attribute
    {

        int appID;
        public int ApplicationID
        {
            get { return appID; }
            set { appID = value; }
        }
        Permission _allMask;
        public Permission AllMask
        {
            get { return _allMask; }
            set { _allMask = value; }
        }

        public CheckPermissionAttribute(ApplicationID app, Permission allMask)
        {
            appID = app;
            _allMask = allMask;
        }
        public CheckPermissionAttribute(Permission allMask)
        {
            _allMask = allMask;
        }

    }
AttributeUsage 第一个参数表示该属性可以应用于类,方法,属性,代理上
Inherited 检查继承的权限。
AllowMultiple 充许多次应用。

按下来,设计一个基类,继承自Page:

public   class PageBase : Page
{
Flag _allMask;

/// <summary>
    /// 检查类型权限
    /// </summary>
    public void CheckClass()
    {
        Type type = this.GetType();
        CheckPermissionAttribute att = (CheckPermissionAttribute)CheckPermissionAttribute.GetCustomAttribute(type, typeof(CheckPermissionAttribute));
        if (att != null)
        {
            Check(att.AllMask);
        }
    }

  /// <summary>
    /// 检查函数调用权限
    /// </summary>
    /// <param name="methodName">方法名</param>
    public void CheckMethod(string methodName)
    {
        Type type = this.GetType();
        string name = "*";
        if (!string.IsNullOrEmpty(methodName))
            name = methodName;
        MemberInfo[] mis = type.FindMembers(MemberTypes.Method ,BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.IgnoreCase,Type.FilterNameIgnoreCase,name);
        foreach (MethodInfo m in mis)
       {
           CheckPermissionAttribute att = (CheckPermissionAttribute)CheckPermissionAttribute.GetCustomAttribute(m, typeof(CheckPermissionAttribute));
           if (att != null)
           { 

               Check(att.AllMask);
                          
           }
           
       }
       return;
 
   
    }
    public void Check(Flag permissions)
    {
        if (!CheckPermission(permissions))
        {
            string url = string.Format("MsgPage.aspx?msg={0}", HttpUtility.UrlEncode("您没有权限访问该资源"));
            Response.Redirect(url);
        }
    }
    public void Check(ApplicationID appID, Flag permissions)
    {
        PermissionManager  pm= Spaces.PermissionManager.Instance(appType);
        if (!CheckPermission(pm,permissions))
        {
            string url = string.Format("MsgPage.aspx?msg={0}", HttpUtility.UrlEncode("您没有权限访问该资源"));
            Response.Redirect(url);
        }

    }

 protected override void OnInit(EventArgs e)
    {
        CheckClass();
        base.OnInit(e);
    }

}

 

如何使用:

[CheckPermission(2, Flag.View)]
public partial class MyPage : PageBase
{

}

若没有查看权限,会自运导向错误页面。

在类上应用挺方便。

方法上应用我于一个方法比较麻烦,我还没有找到在页面class里怎么获取当前调用的类名.

可以调用 CheckMethod(方法名称);如
[CheckPermission(2, Flag.Delete)]
public partial class MyPage : PageBase
{
  public void test()
  {
   CheckMethod("test");
   .......
  }
}

相关文章:

  • 2021-07-13
  • 2021-05-18
  • 2022-02-24
  • 2021-05-25
  • 2022-02-22
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-11-13
  • 2021-09-06
  • 2022-01-02
  • 2021-12-19
  • 2021-10-09
  • 2022-01-26
相关资源
相似解决方案