¿Como llamar una accion de un controlador desde el Layout?

publicado por: Anonymous

Tengo un navbar en mi layout, y mi idea es mostrar un numero que es la cantidad de envios (Modelo) qe se hicieron. El tema es que no se como puedo llamar desde mi Layout esa accion.

Muchas gracias!!

SharedFold

        public class SharedController : Controller
        {
            public ApplicaAccContextDB db = new ApplicaAccContextDB();

            public ActionResult _EnviosPendientes()
            {
               return PartialView("_EnviosPendientes", db.Envios.ToList());
            }
        }

(Vista parcial) _EnviosPendientes:

  @model IEnumerable<ApplicaAccWeb.Models.EnviosFold.Envios>

  @{ 
      int i = 0;
  }

  @foreach (var item in Model) {
      if (item.Estado == false)
      {
          i++;
      }
  }

  @i

_Layout:

    <div class="navbar-collapse collapse collapser pull-right">

                <!--Tabla con botones mas inicios-->
                <ul class="nav navbar-nav navbar-left" style="padding-right:15px">
                    <li style="padding:8px">
                        <button onclick="location='../Envios/EnviosPendientesLista/'" target="_blank" class="btn btn-danger">
                            Envios <span class="badge">@Html.Partial("_EnviosPendientes")</span>
                        </button>
                    </li>
                    <li style="padding:8px">
                        @*Obtener ID de usuario y pasarlo por parametros*@
                        <button onclick="location='SharedFold/MensajesLista/'+3"  class="btn btn-warning" type="button" data-toggle="modal" data-target="#myModal">
                            Mensajes <span class="badge"></span>
                        </button>    
                    </li>
                    <li>
                        @Html.Partial("_LoginPartial")
                    </li>
                </ul>

            </div>

solución

No puedo probarlo por ahora, pero la primera solución que se me ocurre es hacer uso de la colección Items del contexto actual:

public class SharedController : Controller
{
    public ApplicaAccContextDB db;

    public SharedController()
    {
        db = new ApplicaAccContextDB();
        System.Web.HttpContext.Current.Items["EnviosPendientes"] = db.Envios.ToList();
    }

    ...
}

y lo uses en el Layout de la siguiente manera:

@Html.Partial("_EnviosPendientes", (List<ApplicaAccWeb.Models.EnviosFold.Envios>)Context.Items["EnviosPendientes"])

EDIT

De acuerdo a tu comentario, entonces mejor inténtalo con secciones:

  • En el _Layout.cshtml

    <div class="navbar-collapse collapse collapser pull-right">
    
        <!--Tabla con botones mas inicios-->
        <ul class="nav navbar-nav navbar-left" style="padding-right:15px">
            <!-- Ojo: aquí es donde ocurre la magia -->
            @RenderSection("ViewData", required: false)
            <li style="padding:8px">
                @*Obtener ID de usuario y pasarlo por parametros*@
                <button onclick="location='SharedFold/MensajesLista/'+3" class="btn btn-warning" type="button" data-toggle="modal" data-target="#myModal">
                    Mensajes <span class="badge"></span>
                </button>
            </li>
            <li>
                @Html.Partial("_LoginPartial")
            </li>
        </ul>
    </div>
    
  • En tu controlador/acción:

    public ActionResult Envios()
    {
        ...
        ViewBag.EnviosPendientes = db.Envios.ToList();
        return View();
        // O
        ViewData["EnviosPendientes"] = db.Envios.ToList();
        return View();
        // O
        return View(db.Envios.ToList());
    }
    
  • En la vista:

    @* Depende de cómo lo mandes, si usas un *@
    @model IEnumerable<ApplicaAccWeb.Models.EnviosFold.Envios>
    @* Tu contenido *@
    @section ViewData{
        @{
            int i = 0;
            // O lo obtienes con
            var _lista = (List<ApplicaAccWeb.Models.EnviosFold.Envios>)ViewBag.EnviosPendientes;
            // O
            var _lista = (List<ApplicaAccWeb.Models.EnviosFold.Envios>)ViewData["EnviosPendientes"];
    
            foreach (var item in _lista)
            {
                if (!item.Estado)
                {
                    i++;
                }
            }
        }
            <li style="padding:8px">
                <a href="../Envios/EnviosPendientesLista/" target="_blank" class="btn btn-danger">
                    Envios <span class="badge">@i</span>
                </a>
            </li>
    }
    

Y así, en cada vista adaptas la sección ViewData conforme a las necesidades de cada vista, la cual puedes incluir o no en el Layout.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *