2012-12-27 2 views
0

웹 개발을 위해 ASP.Net을 사용하고 있습니다. 여기 상황이있다. 내 페이지에 HTML/ASP.Net 컨트롤이 여러 개 있다고 가정하고 로그인 한 사용자의 역할에 따라 각 컨트롤의 가시성을 설정해야합니다. 각 기능-이름을 저장역할 기반의 모든 HTML 요소 표시 - 최적화 된 솔루션 필요

  1. 및 역할의 조합이 각 HTML/ASP.Net 제어를위한 역할 권한을 검사, 렌더링시 DB
  2. 입니다 : 다음과 같이 내가이 일을 해요.

예컨대이 같은 표시 일 :

<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 
} 

문제는, 내가 모든 컨트롤에 대해이 작업을 수행했습니다. 이를 위해 다른 최적화 된 방법이 있습니까? 제발 도와주세요

답변

1

해결하려는 대상에 대한 설명 만 주어진다면 기본 제공되는 것들을 상속하고 속성을 추가하는 자체 컨트롤을 만드는 것이 좋습니다. 그런 다음 컨트롤을 통해 가시성 검사를 직접 수행 할 수 있습니다. 당신이 당신의 Web.config에 넣고 경우

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; 
    } 
    } 
} 

와 같은 뭔가가 다음 (죄송합니다, 여기에 적절한 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" />

이것은 여러 가지 방법 중 하나 일뿐입니다. 물론 모든 요구 사항에 따라 달라집니다. 하지만 컨트롤을 관리 할 수있는 가능성을 가질 수 있도록 자신 만의 클래스가 필요할 것이라고 확신합니다.

+0

꽤 보이는! 하지만 내 페이지에 많은 ASP.Net 컨트롤이 있습니다. 모든 기본 컨트롤을 재정의 된 컨트롤로 바꾸고 싶지 않습니다. ASP.net이 자체적으로 제어 할 수 있습니까? – MVC3Seeker

+0

Visible 속성에 호출을 임베드하여 시도한 것처럼 할 수 있다고 가정합니다. 그러나 정확하게 기억한다면, 대신에 데이터 바인딩 식 '<% # CheckVisibility() %>'를 사용해야합니다. 당신이 질문에 사용했던 표준 코드 너겟'<% = CheckVisibility() %>'. 그리고 코드 숨김의 페이지에서'DataBind()'호출이 필요하다고 생각합니다. 나는 장기적으로 당신이 컨트롤을 상속하고 그들을 대체함으로써 더 나을 것이라고 생각합니다. 그것은 훨씬 더 유연합니다. –

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> 

당신이 마스터 페이지를 사용하는 경우가

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