0

Web 開発に ASP.Net を使用しています。ここに状況があります。ページに多数の HTML/ASP.Net コントロールがあり、ログイン ユーザーの役割に基づいて各コントロールの可視性を設定したとします。このために、私は次のようにしています:

  1. 各機能名とロールの組み合わせを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
}

問題は、すべてのコントロールに対してこれを行う必要があることです。これを行うために利用できる他の最適化されたアプローチはありますか? 私を助けてください

4

3 に答える 3

1

あなたが解決しようとしていることの説明だけを考えると、組み込みのものから継承し、いくつかのプロパティを追加する独自のコントロールを作成することをお勧めします。その後、コントロールは可視性チェックを自分で行うことができます。何かのようなもの

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>

これをマークアップに追加できます。 <sot:Label ID="AdminLabel" runat="server" Text="Bind this in OnLoad/!IsPostback or something" DisplayRoles="Admin,Management" />

これは、これを行うことができる多くの方法の 1 つにすぎません。もちろん、それはすべて要件に依存します。しかし、コントロールを管理しやすくするためには、コントロール用の独自のクラスが必要になると確信しています。

于 2012-12-27T06:25:14.660 に答える
0

マスター ページを使用している場合は、ロード時にすべての子ページ コントロールを取得できます (コンテンツプレースホルダーを取得してから、コンテンツプレースホルダー コントロールを取得します)。

次に、すべてのコントロール名を取得したら、テーブルでルックアップを実行し、必要に応じて可視性を 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
于 2015-07-24T14:57:12.480 に答える
0

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>

それが役に立てば幸い

于 2012-12-27T06:27:46.217 に答える