none
ocultar elementos del menú según roles RRS feed

  • Pregunta

  • Buenas tardes,

    He leído el post "DESHABILITAR/OCULTAR CAMPOS EN LA VISTA"

    en el siguiente link: https://social.msdn.microsoft.com/Forums/es-ES/9034d91b-4b44-4cfa-9ae1-0df42055e58f/deshabilitarocultar-campos-en-la-vista?forum=aspnetmvces

    Entendí la buena práctica que propone Leandro en no realizar lógica de negocio en la vista.

    El problema que tengo, es que el menú está en el layout, que comparten todas las vistas, en donde a cada vista va un modelo distinto o viewmodel. Tengo 3 roles, cliente, operador y profesional. Dependiendo del rol se deben mostrar el menú con los accesos correspondiente. También se agrega la Autorización en cada controlador con el rol correspondiente.

    Una de las opciones es crear una clase de la que hereden todas las vistas (viewmodels) y que esa clase contenga una propiedad bool por cada item del menú?. Después crear un servicio que me complete dichas propiedades, lo que debería utilizarlo en todas las acciones de todos los controladores.

    O qué se les ocurre?.

    Desde ya muchas gracias, aguardo sus sugerencias, críticas, links!.

    martes, 20 de enero de 2015 15:06

Todas las respuestas

  • Disculpen,

    Otra de las formas que se me ocurrió, es crear 3 áreas distintas en las vistas, donde cada área represente las vistas adecuadas según el rol, y cada carpeta tenga su propio layout y sólo valido en la servidora Autorizando roles a los controladores.

    El problema es que si un usuario tiene 2 roles, que vista debo mostrar?... Ese es un problema...

    martes, 20 de enero de 2015 15:12
  • Hola Juan,

    Si la lógica de habilitar o desabilitar lo tienes en _Layout.cshtml yo no me haría demasiados problemas y trabajaría con un @if preguntando por el usuario o rol tal como lo sugieren en el post que adjuntas

    @if(User.IsInRole("profesional")
    {
      @ActionLink("Menu 1")
    }


    Si la solución propuesta atendió su consulta no olvide marcarla como respuesta.


    Willams Morales P.
    Arequipa - Perú



    martes, 20 de enero de 2015 15:36
  • No conozco la lógica de navegación de su aplicación web, así que no me voy a meter con la segunda forma.  Sin embargo, debo decir que si usted sabe qué cosas se ocupan exactamente en cada vista, entonces su segunda forma no suena mal.  En fin, piénselo usted a ver cómo le va.

    En cuanto a la primera opción, supongo que sería algo bueno tener una clase base para modelos que incluya Booleanos según los accesos del usuario. Yo crearía una clase base Controller y sobreescribiría View() para llenar los valores.

    namespace MVCApp1.Models
    {
        public class BaseVM
        {
            public bool EsCliente { get; set; }
            public bool EsOperador { get; set; }
            public bool EsProfesional { get; set; }
        }
    }
    
    --------------------------------------------------
    using System.Web.Mvc;
    using MVCApp1.Models;
    
    namespace MVCApp1.Controllers
    {
        public class Controller : System.Web.Mvc.Controller
        {
            protected override ViewResult View(IView view, object model)
            {
                BaseVM vm = model as BaseVM;
                if (vm != null)
                {
                    //Aquí asignamos los booleanos.
                }
                //Retomamos la funcionalidad original.
                return base.View(view, model);
            }
        }
    }

    Ya con eso supongo que es posible insertar la lógica de visibilidad de los controles del menú en el layout principal.


    Jose R. MCP
    Code Samples

    martes, 20 de enero de 2015 15:38
  • Efectivamente esa es la solución Gracias
    viernes, 5 de mayo de 2017 15:09