2012-01-03 63 views
1

目前我正在开发一个项目,其中有四个角色的用户可以访问相同的页面(有大量的页面,每个页面中有近80-90个控件,分别是:()。基于角色的启用/禁用asp.net中的控件

的要求是,根据每个角色,用户应该能够查看每个页面的特定控件(即控制一个角色可见不必给其他角色可见)。
它看起来非常简单的功能,我也知道我可以使用后面的代码(例如controlname.visible = false等)来做到这一点,但是由于有很多页面中有很多控件,它们是特定于特定角色的,因此它变得非常冗长且不易维护代码

任何一个可以给我做这件事,这将是稳健的,维护良好的代码。(jQuery的,使用Javascript的解决方案也会做..)

+0

感谢您的兴趣..但我已经有办法做到这一点(请阅读Shoaib Shaikh的答案)..我想这样做只基于角色......无论如何感谢您的兴趣.. :) – 2012-01-03 07:44:59

回答

11

这是非常好的问题一下去年我心中最好的方式。 。这是我想到的,它有点冗长,但我希望这可以帮助..

首先,你将不得不看看在Asp.net ControlAdapters。

http://www.asp.net/cssadapters/WhitePaper.aspx

概述: 1.创建您要启用和基于角色的禁用控制型控制适配器。 2.在asp.net控件上应用一些属性,指定哪些角色可以访问该控件。

在asp.net页面尝试这样

<asp:TextBox ID="TextBox1" runat="server" CRAN="1"></asp:TextBox> 

这里CRAN一些事情是我的自定义属性和是角色ID可以访问页面上此控制。

现在是时候创建一个控制适配器,它将根据角色启用/禁用此控件。

public class TextBoxAdapter: 
    System.Web.UI.WebControls.Adapters.WebControlAdapter 
    { 

     protected override void OnLoad(EventArgs e) 
     { 
      if (this.Page is ISecurable) 
      { 
       WebControl tb = this.Control as WebControl; 

       string roles = tb.Attributes[Constants.ControlRoleAttributeName]; 
       bool result = true; 
       if (!string.IsNullOrEmpty(roles)) 
       { 
        result = false; 
        string[] role = roles.Split(','); 
        foreach (string r in role) 
        { 
         if (Roles.IsUserInRole(r)) 
         { 
          result = true; 
         } 
        } 

       } 

       tb.Enabled = result; 
       //tb.BackColor = Color.Red; 
      } 
      base.OnLoad(e); 
     } 
    } 

这是我创建的控制适配器将启用/禁用基于角色的控制。你可以修改这个显示/隐藏控制。

你将有一个.browser文件

<browsers> 
    <browser refID="Default"> 
    <controlAdapters> 

    <adapter controlType ="System.Web.UI.WebControls.TextBox" adapterType="MyProject.ControlAdapter.TextBoxAdapter" /> 
    </controlAdapters> 
    </browser> 
</browsers> 

结论登记在asp.net的App_Browser文件夹此控件适配器: 你将不得不只为了显示元素上应用的属性隐藏。我已经为Textbox创建了适配器,您可以尝试创建一些通用适配器,如WebControl/Control。

问候。

+0

帽子给你先生......你的代码完全为我工作......这是我需要的相同方法......非常感谢你......我感谢你的帮助...... :) – 2012-01-03 07:41:03

+0

请将问题标记为已回答 – 2012-01-03 07:52:59

+0

+ 1是一个很好的例子,并且用于管理成功解码问题。 – RickNZ 2012-01-03 10:24:43