2012-01-03 68 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