none
Carregando RenderAction dentro de _Layout RRS feed

  • 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
    segunda-feira, 28 de novembro de 2016 16:17

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
    segunda-feira, 28 de novembro de 2016 16:36

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/

    att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    segunda-feira, 28 de novembro de 2016 16:24
    Moderador
  • 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
    segunda-feira, 28 de novembro de 2016 16:36
  • 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!

    segunda-feira, 28 de novembro de 2016 17:12