Inquiridor
Atualizar _Layout para diferentes tipos de usuários

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