2015-03-28 3 views
0

Я новый разработчик веб-форм ASP.NET, и сейчас я боюсь скрыть и показать элементы управления меню ASP.NET на основе роли пользователя. Роли определяются мной в базе данных и на основе результата проверки роли пользователя система должна отображать или скрывать некоторые элементы меню.Как устранить эту проблему с помощью элемента управления ASP.NET?

У меня есть следующий элемент управления ASP.NET меню в мастер-странице:

<asp:Menu ID="Menu" runat="server" PathSeparator="," Orientation="Horizontal" EnableViewState="false"> 
    <Items> 
     <asp:MenuItem Text="Home" NavigateUrl="~/Pages/Default.aspx" Value="home"></asp:MenuItem> 
     <asp:MenuItem Text="Sheet" NavigateUrl="~/Pages/Sheet.aspx" Value="sheet"></asp:MenuItem> 
     <asp:MenuItem Text="Test" NavigateUrl="~/Pages/Test.aspx" Value="test"></asp:MenuItem> 
    </Items> 
</asp:Menu> 

И в отделенного кода на главной странице я делаю следующую логику:

protected void MenuAccess() 
{ 
    if(Acccess.HasAccess(username)) 
    { 
     if(Access.IsAdmin(username)) 
     { 
      SetMenuItemUrl("sheet", "~/Pages/Sheet.aspx?UserId="); 
      HideMenuItem("test"); 
     } 
     if(Access.IsSupport(username)) 
     { 
      SetMenuItem("test"); 
     } 
    } 
} 

protected void HideMenuItem(string valuePath) 
    { 
     SetMenuItem(valuePath, false, null); 
    } 

    protected void SetMenuItemUrl(string valuePath, string url) 
    { 
     SetMenuItem(valuePath, true, url); 
    } 

    protected void SetMenuItem(string valuePath, bool visible, string url) 
    { 
     var item = Menu.FindItem(valuePath); 
     if (item != null) 
     { 
      if (url != null) 
       item.NavigateUrl = url; 

      if (visible == false) 
      { 
       if (valuePath.LastIndexOf(',') < 0) 
        Menu.Items.Remove(item); 
       else 
       { 
        MenuItem parent = Menu.FindItem(valuePath.Substring(0, valuePath.LastIndexOf(','))); 
        parent.ChildItems.Remove(item); 
       } 
      } 
     } 
    } 

Однако , если у пользователя две роли: администратор и поддержка, то элемент меню со значением «test» не будет отображаться, и я не знаю почему. Не могли бы вы помочь мне с этим?

+0

Поскольку вы скрываете, если пользователь является администратором - HideMenuItem ("test"); – malkam

+0

@malkam, не могли бы вы рассказать мне, что я должен делать? –

ответ

0

Ваш код удаляет элемент из меню, но когда вы переходите к его настройке позже, вы никогда не добавляете его обратно в пункты меню.

Возможно, вместо удаления элемента меню вы можете изменить его видимость? Это позволит вам скрыть/показать его в зависимости от видимого bool. Вам также понадобится реализовать это в вашей функции SetMenuItem.

Это документация MSDN для класса MenuItem. Я не вижу настройки видимости, но вы можете использовать Enabled или Selected в зависимости от ваших потребностей. Однако это покажет вариант для всех, они просто не смогут взаимодействовать с ним. Не уверен, что это приемлемо или нет.

Что-то вроде этого должно закрыть вас. Вам нужно будет проверить, как это работает.

protected void SetMenuItem(string valuePath, bool visible, string url) 
{ 
    var item = Menu.FindItem(valuePath); 
    if (item != null) 
    { 
     if (url != null) 
      item.NavigateUrl = url; 

     item.Enabled = visible; 
    } 
} 
+0

благодарит за вашу помощь. Не могли бы вы помочь мне, изменив метод, который у меня есть в моем коде? Я борюсь с его модификацией. Заранее спасибо. –

+0

См. Редактирование для возможного решения. –

+0

Я пробовал, но это не сработало со мной. –

 Смежные вопросы

  • Нет связанных вопросов^_^