【问题标题】:Display all HTML elements based on Role - Need Optimized Solution根据角色显示所有 HTML 元素 - 需要优化的解决方案
【发布时间】:2012-12-12 13:08:50
【问题描述】:

我正在使用 ASP.Net 进行 Web 开发。我这里有情况。假设我的页面上有许多 HTML/ASP.Net 控件,并且我必须根据登录用户的角色设置每个控件的可见性。为此,我正在执行以下操作:

  1. 存储每个 Function-Name 和 Role 组合是 DB
  2. 在渲染期间,检查每个 HTML/ASP.Net 控件的角色权限。

例如:显示如下内容:

<asp:Label runat="server" id="Lbl1" visible='<%=CheckVisibility("Display","Admin")%>'>

public bool CheckVisibility(string FunctionName, string RoleName){
  // checks for db entry and returns bool value
}

问题是,我必须为所有控件执行此操作。有没有其他优化的方法可以做到这一点?请帮帮我

【问题讨论】:

    标签: asp.net html database controls visible


    【解决方案1】:

    如果您使用的是母版页,则可以在加载时获取所有子页面控件(获取 contentplaceholders,然后获取 contentplaceholder 控件)。

    然后,当您拥有所有控件名称后,请在您的表上进行查找,并在需要时将其可见性设置为 false。

    (下面是vb,但翻译应该很容易。)

            For Each cp As String In Me.ContentPlaceHolders
                For Each ctl As Control In Me.FindControl(cp).Controls
                    If adminonly.Contains(ctl.ID) Then
                        ctl.Visible = False
                    End If
                Next
            Next
    

    【讨论】:

      【解决方案2】:

      C#代码:

      public enum previlageType
      {
          superAdminPrevilages=1,
          partnerPrevilages = 2,
          dealerPrevilages = 3,
          customerPrevilages=4
      
      }
      
      if ((previlageType)Enum.Parse(typeof(previlageType), Session["previlageType"].ToString())== previlageType.partnerPrevilages)
      {
          accordion.Visible = false;
      }
      

      ASP 代码:

      <div id="accordion" runat="server">
      Hello World, I'l be Hidden if a person with partner previlages is logged in. BUt will be visible if superadmin or any person except Partner logs in.
      </div>
      

      希望对你有帮助

      【讨论】:

        【解决方案3】:

        仅根据您对您要解决的问题的描述,我建议您创建自己的控件,这些控件继承自内置控件并向它们添加一些属性。然后控件可以自己进行可见性检查。类似的东西

        namespace StackOverflowTest
        {
          public class Label : System.Web.UI.WebControls.Label
          {
            public string DisplayRoles { get; set; }
        
            protected override void OnPreRender(EventArgs e)
            {
              base.OnPreRender(e);
        
              Visible = PermissionHelper.CheckPermission("Display", DisplayRoles.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries));
            }
          }
        
          public static class PermissionHelper
          {
            public static bool CheckPermission(string function, string[] allowedRoles)
            {
              // TODO: hit some sort of cache, so you don't make a bajillion queries to the DB
              return true;
            } 
          }
        }
        

        然后,如果你把它放在你的 web.config 中(抱歉,在这里不知道如何进行正确的 XML 格式设置):<system.web> <pages> <controls> <add tagPrefix="sot" assembly="StackOverflowTest" namespace="StackOverflowTest"/> </controls> </pages> </system.web>

        您可以将其添加到您的标记中: &lt;sot:Label ID="AdminLabel" runat="server" Text="Bind this in OnLoad/!IsPostback or something" DisplayRoles="Admin,Management" /&gt;

        这只是您可以做到这一点的众多方法之一。当然,这一切都取决于要求。但我很确定您需要自己的控件类才能使其易于管理。

        【讨论】:

        • 看起来很漂亮!但是我的页面上有很多 ASP.Net 控件。我不想用重写的控件替换所有本机控件。可以用 ASP.net 控件本身来完成吗?
        • 我想你可以通过将调用嵌入到 Visible 属性中来按照你尝试的方式进行操作,但如果我没记错的话,你将不得不使用数据绑定表达式 &lt;%#CheckVisibility()%&gt; 而不是您在问题中使用的标准代码块&lt;%=CheckVisibility()%&gt;。然后我认为您需要在代码隐藏中的页面上调用DataBind()。我仍然认为,从长远来看,继承控件并替换它们会更好。它更加灵活。
        猜你喜欢
        • 2020-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-23
        • 2012-08-01
        • 1970-01-01
        • 2021-01-23
        相关资源
        最近更新 更多