我的想法是做一个usercontrol来实现
每个要控制的页面上面加载一个usercontrol,设置usercontrol的页面权限属性,然后在页面load的时候把需要控制的控件传递到usercontrol中定义的一个control数组,然后依据用户登陆是赋予的权限来和usercontrol的页面权限属性来比较决定控件的visible,以达到控制拥护操作权限。不知道我的想法是否可行?
有没有其他的办法来达到我要的效果?怎么实现?
你们控制页面的权限一般是怎么做的?

解决方案 »

  1.   

    我做的时候是通过参数来控制的,你的想法应该是可行的(visible=false/true,endable=false/true)
      

  2.   

    我的观点:动态添加控件不是个好主意,不论是页面还是用户控件。
    如果你的控件数量不是很多的话,可以用三个<span runat="server">,对应着你的三中权限,里面有各种控件,然后根据用户的权限,显示对应的<span>,而其它两个不显示。
      

  3.   

    你说的不就很好么,我做过的原理和你说的基本一样,只是把usercontrol换成普通的webcontrol而已,对于不可见的用户直接就把页转到其它地方了
      

  4.   

    to gshope(北京.Net)
    用<span runat="server">也可以实现
    有时候要控制的控件的位置是比较的散乱的,而且不同的用户要可操作的控件的组合也是不一定的,有的用户要可操作两个控件,有的只可以操作一个,所以都放在<span runat="server">不怎么好控制
      

  5.   

    那么对于控件本身允许哪几种权限的用户来操作,写死在你说的方法中?也许也是传个参数过来,但是哪个参数是怎么得来?我现在用usercontrol来设置的,想得到一个灵活的配置,不要编译,直接修改就可以达到添加和减少这个控件允许操作的用户权限,配置如果写在xml中也不怎么好和响应的页面对应,而且要配置xml中也要写不少,比较烦琐,有好的方法吗?
      

  6.   

    上面是to gshope(北京.Net)to srz007(呵呵) 
    你写的那个东东可以给我参考一下吗?
    谢谢!^_^
      

  7.   

    这个问题我也想了好久,能否搞个通用的除了,大家一起完善他。
    来这个问题讨论的都是高手呀(except me)
      

  8.   

    我可见、不可见的两层操作权限是这样来控制的:usercontrol 的 cs代码namespace DataPlatform.Web.Ascx
    {
    using System;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls; /// <summary>
    /// pageRights 的摘要说明。
    /// </summary>
    public abstract class pageRights : System.Web.UI.UserControl
    {
    private string m_allowRoles="?";
    private bool isHaveRights=false;
    //* 允许所有的用户,包括匿名用户
    //? 允许所有已登录的用户,不包括匿名用户
    //9 admin  8, caiwu,7, 审核,6 监测 //获取参数
    public string allowRoles
    {
    get

    return m_allowRoles ;
    }
    set
    {
    m_allowRoles = value ;
    }
    }
    private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面
    if (!IsPostBack)
    {
    switch (m_allowRoles)
    {
    case "*": break;
    case "?":
    //登陆用户的权限,Session["userLevel"]==null表示用户没有登陆。
    //目前系统的权限定义是 2是管理员,1是普通用户
    if (Session["userLevel"]==null)
    {
    // Response.Redirect ("/DataPlatform/web/noRights.aspx");
    return;
    }
    break;

    default:
    if (Session["userLevel"]==null)
    {
    // Response.Redirect ("/DataPlatform/web/noRights.aspx");
    return;
    }

    if (int.Parse(Session["userLevel"].ToString())>=int.Parse(m_allowRoles))
    {
    isHaveRights=true;
    break;
    } if (!isHaveRights)
    {
    // Response.Redirect ("/DataPlatform/web/noRights.aspx");
    return;
    }
    break; }//end switch
    }
    } #region Web Form Designer generated code
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN:该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// 设计器支持所需的方法 - 不要使用
    /// 代码编辑器修改此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {
    this.Load += new System.EventHandler(this.Page_Load);
    }
    #endregion
    }
    }
    页面中使用:
    <uc1:pageRights id="PageRights1" runat="server" allowRoles="2"></uc1:pageRights>
    通过allowRoles="2"来决定页面的可访问权限,来和用户的权限比较。现想假如上面我提到的功能,比如给控件也赋予allowRoles="2"的属性,来决定控件的可访问权限,
    大家多提意见。
      

  9.   

    哎 权限这个东西最复杂了每个页面的权限分为 canView canEdit canAdd canDelete 然后设置几个用户组比如 Administrator ,PowerUser ,User ,Anonymouse指定页面对应每个用户组 分配不同的权限在访问页面的时候 先读出权限 然后处理是否显示
      

  10.   

    对了 可以借鉴一下 Ms 的 ASP Starter Kits里面几个例子的方法
      

  11.   

    to kentpower()
    我就是在问怎么实现你说的那样的功能?什么方法比较好?
      

  12.   

    这种情况应该还好,可以判断权限后遍历页面的控件来控制。
    我想问一下,当用户有一个权限的时候,对于页面控件有的可以编辑有的只能看,这个怎幺控制?
    当用户有另一个权限的时候,控件的控制又不一样了。而且最不好的是属性太多,页面又要求美观,不能简单的用<span>和usercontrol来操作?
      

  13.   

    可以在后台cs文件设置用户类型标志。
    然后在aspx文件中判断。
    在aspx文件中
    <% if (usergroup=="manager") { %>
      .....//manager类用户可以访问的控件
    <% } %>
    <% if (usergroup=="user") { %>
      .....//user类用户可以访问的控件
    <% } %>
    如果要区分可编辑之类的属性,就在某类用户可见的控件设置为可编辑的。只允许view的用户就只给他属性是不可编辑的控件。这种办法,服务器控件和html控件都可以用。
    或者在cs文件中设置权限表。
    在aspx文件中
    <% if (power.control1=="OnlyView") { %>
    ......
    <% } %>
    <% if (power.control1=="CanEdit") { %>
    ......
    <% } %>
      

  14.   

    用SESSION传来用户的权限,然后设置为enable为true或false应该可以吧
      

  15.   

    问题差不多,借大侠宝地用一下,如果有答案,另开贴结份我现在遇到这种问题,还没有好的解决方案。
    我打算在数据库中建一个控件和权限(功能)的对应表
    例如:
    权限名  控件名  是否只读  是否可见  是否有效
    添加   添加按键   0     1      1
    添加   修改按钮   0     0      0
    添加   用户名    0     1      1
    添加   密码     0     1      1修改   添加按钮   0     0      0
    修改   修改按钮   0     1      1
    修改   用户名    1     1      0
    修改   密码     0     1      1
    有几十个属性和十几个按键(也就是功能)
    在程序中根据权限读出控件记录放在DataTable里
    然后
    首先在页面上把所有的控的属性全部置为不可见或只读或无效
    for(int I =0; I <DataTableTemp.Rows.count ; I ++ )
    {
    string strControlID = DataTableTemp.Rows[i][” 控件名”].ToString();
    WebControl TempControl = (WebControl) Form1.FindControl(DataTableTemp.Rows[i][” 控件名”].ToString);
      switch(strControlID.substring(0,3)
    {
      case “txt”:
        TempControl = (TextBox) TempControl;
    case “cmd”:
      TempControl = (Button) TempControl;}
      if(DataTableTemp.Rows[i][”是否只读”].Tostring == “1”)
      ﹛
       TempControl.Readonly = false
      ……..

    …………
    }我担心有些问题,一个是(WebControl)这种装箱,拆箱是不是能够成功?
    还有一个FindControl的效率狂差,是不是会很影响速度,有没有什幺别的方法可以控制?
    这种命名必须是匈牙利命名。对每个控件做控制,我想把同一类属性用控件数组,以前在VB中用过,但是现在在.net不知道能不能用
      

  16.   

    刚才做一个测试程序发现不要用webcontrol,因为ReadOnly属性webcontrol没有,这样也不用装箱了,不过代码量上去不少。因为每种控制都要写
    for(int i = 0 ; i < dtTemp.Rows.Count ; i ++ )
    {
    string strControlID = dtTemp.Rows[i]["Control"].ToString();
    switch(strControlID.Substring(0 , 3))
    {
    case "txt":
    TextBox TempControl = (TextBox)t.FindControl(strControlID);
    if(dtTemp.Rows[i]["ReadOnly"].ToString() == "1")
    {
        TempControl.ReadOnly = true;
    }
    break;
    }

    }
      

  17.   

    我有一个方法可共参考,我一般也是这么实现的。
    写一个方法比如public bool Opini(username,1111)
    {
     if (username满足)
    {
     return true;
    }
    else
    {
    return false;
    }
    }
    然后调用这个方法
    if( Opini)
    {
    显示,编辑等可用
    }
    else
    {
    不可用
    }
    并且在load时也可以用这个方法,判断是否可见,可用整个页面,以后有关权限都可以调用他来设置
    这只是我的小建议
      

  18.   

    我靠??????这问题怎么结分了啊..晕...来晚了......瞎讨论一下吧既要方便,又要易用,我的办法是这样:--------------------------------------------自写一个权限通用类. Class UserSecu()
    而每个页面文件都有相应的一个....文本文件,(或INI文件,XML文件均可..)
    文件内容则是:该页面所有控件的 控件名称->可见(Y/N)->可写(Y/N)
    ```````````````````````````````
    自己写方法,读取...类中有方法:SetControl()
    具体作用则是:
    (记得要用在地址栏上保存COOK那样,省得有人禁用COOK了)检查用户的类型,(游客,普通用户,管理员..等..)..再读取相应的权限文件,,确定当前用户所具权限.最后调用 SetControl(UserType,PageUrl)
    UserType即是自定义类型.
    PageUrl即当前页面地址,(也即文件名称..比如: userlist.aspx ,,或者,直接在SetControl类中直接写方法,自动获得当前页面地址,截得 完整的文件名称.)根据相应文件内容,循环页面所有控件,同时对应文件内所写,各控件的可见可写属性...赋给各控件..===========================罗里罗索的半天,前期工作做好,
    后来就是做好页面,再做一个,控件属性的文件..
    最后,在页面中,load里调用,UserSecu.SetControl()方法即可...
      

  19.   

    谢谢minghao1039(明皓) ( ) 信誉:91 的参与