Usuário com melhor resposta
Carregando RenderAction dentro de _Layout

Pergunta
-
Olá pessoal, gostaria de saber, como faço para carregar dados de uma model dentro no meu _Lauoyt. Bom vamos lá possuo um layout padrão para todas as views do meu projeto onde nesse layout encontrasse a div onde fica a foto de usuário que está na minha aplicação no momento, sendo assim eu teria que trabalhar com 2 models ao mesmo tempo uma para pegar a foto e nome do usuário e a outra das funcionalidades do sistema.
Na div onde fica a foto do usuário está assim:
<div class="user-img-div user-basic basic-perfil-borda"> <img src="/Content/NewTheme/img/user.png" class="img-thumbnail" /> <div class="inner-text"> Jhon Deo Alex <br /> <small>Last Login : 2 Weeks Ago </small> </div> </div>
Estou realizando essa alteração para tentar passar a foto do usuário nomento em que a _layout for chamada
<div class="user -img-div user-bas ic basic-perfil-borda"> <img src="@Html.RenderAction("Partial1","Perfil")" class="img-thumbnail" /> <div class="inner-text"> Jhon Deo Alex <br /> <small>Last Login : 2 Weeks Ago </small> </div> </div>
PerfilController:
public class PerfilController : Controller { Usuarios user = new Usuarios(); DataContext db = new DataContext(); // GET: /Perfil/ public ActionResult Partial1() { var imagemlogo = db.usuarios.Where(p => p.Id == 1); user.UrlImg = imagemlogo.ToString(); return View(user.ToString()); } }
Partial1.cshtml:
@model IntranetCBL.Usuarios @foreach (var item in Model) { @item.UrlImg } @{ Layout = null; } <h1>teste</h2>
Minha aplicação iniciara pela HomeController:
public class HomeController : Controller { DataContext db = new DataContext(); CRUD cru = new CRUD(); public ViewResult Index(int? pagina) { int tamanhoPagina = 3; int numeroPagina = pagina ?? 1; return View(db.avisos.OrderByDescending(p=> p.Id).ToPagedList(numeroPagina,tamanhoPagina)); }
Index.cshtml:
@model PagedList.IPagedList<IntranetCBL.Avisos> @using PagedList.Mvc @{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml"; } @foreach (var item in Model) { @*<div class="container-fluid">*@ <div class="panel panel-primary"> <div class="panel-heading"> <h3>@item.Titulo</h3> </div> <div class="panel-body"> <div class="row"> <div class="col-md-10"> @item.Texto </div> </div> <div class="row"> <div class="col-md-10"> <img src="@item.UrlImg" class="img-responsive" /> </div> </div> </div> <div class="panel-footer"> <div class="row"> <div class="col-md-3"> Autor: @item.usuario.Nome </div> <div class="col-md-3"> @item.DataAviso </div> </div> </div> </div> @*</div>*@ }</br> Pagína: @Model.PageNumber de @Model.PageCount @Html.PagedListPager(Model, page => Url.Action("Index", new { pagina = page}))
Alguem pode me ajudar?
- Editado EliDev segunda-feira, 28 de novembro de 2016 16:20
Respostas
-
Olá,
Eu acredito que para esse detalhe pequeno do sistema, seria melhor utilizar uma Session para carregar a imagem/nome e exibir na sua View. Isso é bom pois não será sempre que terá que consultar o banco para trazer a foto, somente quando a Session expirar (dessa forma você economiza no tráfego também, já que o _Layout é chamado sempre).
Eu carregaria esses dados no evento Application_ AcquireRequestState do Global.asax:
protected void Application_AcquireRequestState() { if (Context.Handler is IRequiresSessionState || Context.Handler is IReadOnlySessionState ) CarregarDadosUsuario(); } private void CarregarDadosUsuario() { if (HttpContext.Current.Session["UsuarioImagem"] == null || HttpContext.Current.Session["UsuarioNome"] == null) { var user = db.usuarios.Where(p => p.Id == 1); HttpContext.Current.Session.Add("UsuarioImagem", user.UrlImg); HttpContext.Current.Session.Add("UsuarioNome", user.Usuario.Nome); } }
No seu _Layout, pode fazer assim:
<img src="@Session["UsuarioImagem"]" class="img-thumbnail" /> <div class="inner-text">@Session["UsuarioNome"]</div>
Vai carregar certo, pois as Sessions já terão sido carregadas.
Espero ter ajudado!
Valeu!
Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
André Secco
Microsoft MSP & MSDN Tech Advisor
Blog: http://andresecco.com.br
GitHub: http://github.com/andreluizsecco
Twitter: @andre_secco- Marcado como Resposta EliDev segunda-feira, 28 de novembro de 2016 17:08
Todas as Respostas
-
Utilizar um Model no Layout, implica disponibilizar este model em todas as açoes (actions)
Para isso sobrescreva o evento OnActionExecuted, mais ou menos como mostrado neste artigo:
https://dtoncode.wordpress.com/2012/07/30/strongly-typed-models-on-your-layout/
William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------
-
Olá,
Eu acredito que para esse detalhe pequeno do sistema, seria melhor utilizar uma Session para carregar a imagem/nome e exibir na sua View. Isso é bom pois não será sempre que terá que consultar o banco para trazer a foto, somente quando a Session expirar (dessa forma você economiza no tráfego também, já que o _Layout é chamado sempre).
Eu carregaria esses dados no evento Application_ AcquireRequestState do Global.asax:
protected void Application_AcquireRequestState() { if (Context.Handler is IRequiresSessionState || Context.Handler is IReadOnlySessionState ) CarregarDadosUsuario(); } private void CarregarDadosUsuario() { if (HttpContext.Current.Session["UsuarioImagem"] == null || HttpContext.Current.Session["UsuarioNome"] == null) { var user = db.usuarios.Where(p => p.Id == 1); HttpContext.Current.Session.Add("UsuarioImagem", user.UrlImg); HttpContext.Current.Session.Add("UsuarioNome", user.Usuario.Nome); } }
No seu _Layout, pode fazer assim:
<img src="@Session["UsuarioImagem"]" class="img-thumbnail" /> <div class="inner-text">@Session["UsuarioNome"]</div>
Vai carregar certo, pois as Sessions já terão sido carregadas.
Espero ter ajudado!
Valeu!
Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
André Secco
Microsoft MSP & MSDN Tech Advisor
Blog: http://andresecco.com.br
GitHub: http://github.com/andreluizsecco
Twitter: @andre_secco- Marcado como Resposta EliDev segunda-feira, 28 de novembro de 2016 17:08
-
Muito obrigado amigo, sua solução foi além do que eu esperava, muito obrigado mesmo.
Agora só uma correção, no meu caso em vez de usar Where devo utilizar o Single para corrigir o meu problema.
var user = db.usuarios.Single(p => p.Id == 1);
Mais uma vez obrigado!