none
Atualizar _Layout para diferentes tipos de usuários RRS feed

  • Pergunta

  • Oi pessoal, estou usando o template do ASP.NET MVC 4 para fazer minha aplicação.

    Eu tenho uma nav-bar no meu _Layout e quero fazer a validação com o tipo do usuário que está logado. Se o usuário estiver logado com um usuário tipo "Ouvinte" vai mostrar algo, se for com o tipo "Musico" vai mostrar outras opções na nav-bar.

    Já tentei fazer a validação via @ViewBag, mas não está funcionando, alguém tem mais alguma idéia de como eu posso fazer isso?

    [HttpPost] //Login Post Method
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Login(LoginModel model, string returnUrl)
    {
                if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
               {
                   UserProfile a = new UserProfile();
                    ViewBag.UserType = a.UserType;
                    return RedirectToLocal(returnUrl);
                }
     
                // If we got this far, something failed, redisplay form
                ModelState.AddModelError("", "The user name or password provided is incorrect.");
                return View(model);
    }
     
            [HttpPost] //Register Post Method
            [AllowAnonymous]
            [ValidateAntiForgeryToken]
            public ActionResult Register(RegisterModel model)
            {
                if (ModelState.IsValid)
                {
                    // Attempt to register the user
     
                    try
                    {
                       
                       // var user = new UserProfile() { UserName = model.UserName };
     
                        WebSecurity.CreateUserAndAccount(model.UserName, model.Password, new {UserType = model.UserType });
                        WebSecurity.Login(model.UserName, model.Password);
                        ViewBag.UserType = model.UserType;
                        return RedirectToAction("Index", "Home");
     
                    }
                    catch (MembershipCreateUserException e)
     
                    {
                        ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
                    }
                   
                }
     
     
    //_Layout navbar
     
    <div class="navbar navbar-inverse navbar-fixed-top">
          <div class="container">
            <div class="navbar-header">
              <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
              </button>
               <a class="navbar-brand" href="#">@Html.ActionLink("your logo here", "Index", "Home")</a>
            </div>
            <div class="collapse navbar-collapse">
              <ul class="nav navbar-nav">
                <li>@Html.ActionLink("Home", "Index", "Home")</li>
                <li>@Html.ActionLink("Usuario", "Usuario", "Home")</li>
                <li>@Html.ActionLink("Musico", "Musico", "Home")</li>
              </ul>
              <ul class="nav navbar-nav navbar-right">  
                  @if (!Request.IsAuthenticated)
                  {
                      <li>@Html.ActionLink("Register", "Register", "Account")</li>
                      <li>@Html.ActionLink("Log In", "Login", "Account")</li>
                     
                  }
                  else if (Request.IsAuthenticated && ViewBag.UserType == "Musico")
                 {
                     <li>@Html.Label("Musico")</li>
                 }
                 else if (Request.IsAuthenticated && ViewBag.UserType == "Ouvinte")
                 {
                     <li>@Html.Label("Ouvinte")</li>
                 }
             </ul>
           </div><!--/.nav-collapse -->
         </div>
     
       </div>

    Também tenho minha pergunta no StackOverFlow

    Valeu

    sábado, 11 de outubro de 2014 16:34

Todas as Respostas

  • Você já debugou o código e conseguiu ver o valor que está sendo retornado em ViewBag.UserType?

    Por exemplo, neste trecho de código:

      if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
               {
                   UserProfile a = new UserProfile();
                    ViewBag.UserType = a.UserType;
                    return RedirectToLocal(returnUrl);
                }

    O objeto 'a' é criado e sua propriedade UserType é enviada para a ViewBag antes de receber algum valor, isso pode criar o cenário em que o usuário está logado, mas esse valor não foi enviado para a ViewBag, e então a validação não vai dá certo.

    No momento de registrar novos usuários, a model está com o valor UserType preechido corretamente também?


    Rafael Duarte

    quarta-feira, 15 de outubro de 2014 12:19
  • Pedro,

    Ao invés de utilizar uma ViewBag você pode usar Session ou mesmo Cookies, pois você precisa do estado após múltiplos requests.

    var userType = Session["UserType"] ;

    • Sugerido como Resposta Deric Ferreira quarta-feira, 15 de outubro de 2014 13:20
    quarta-feira, 15 de outubro de 2014 13:20