2

目前我正在从事一个项目,其中有四个角色的用户可以访问相同的页面(有很多页面,每个页面都有近 80-90 个控件:()。

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

谁能给我最好的方法来做到这一点,这将是健壮,维护良好的代码。(jQuery,Javascript解决方案也可以......)

4

1 回答 1

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是我的自定义属性,1是可以在页面上访问此控件的角色 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 文件中的 asp.net 的 App_Browser 文件夹中注册此控制适配器

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

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

结论:您必须只在元素上应用一个属性才能显示隐藏它们。我已经为 Textbox 创建了适配器,您可以尝试创建一些通用适配器,例如 WebControl/Control。

问候。

于 2012-01-03T06:12:25.857 回答