How to call an action of a controller from the Layout? [closed]

0

I have a navbar in my layout, and my idea is to show a number that is the number of shipments (Model) that were made. The issue is that I do not know how I can call that action from my Layout.

Thank you very much !!

SharedFold

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

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

(Partial view) _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>
    
asked by Joaquin Ferrari 26.04.2017 в 18:35
source

1 answer

0

I can not prove it for now, but the first solution I can think of is to use the collection Items of current context :

public class SharedController : Controller
{
    public ApplicaAccContextDB db;

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

    ...
}

and use it in the Layout as follows:

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

EDIT

According to your comment, then better try with sections :

  • In _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>
    
  • On your controller / action:

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

    @* 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>
    }
    

And so, in each view you adapt the ViewData section according to the needs of each view, which you can include or not in the Layout.

    
answered by 26.04.2017 / 19:35
source