19 messaggi dal 27 luglio 2009
Ciao, ho creato il mio controller menu e per questo controller ho creato le views, poi ho creato una pagina di nome Menu.chstml in cui visualizzo la lista dei mei menu e sottomenu, questo é il codice :
@model IEnumerable<Menu3.Models.Menu>

<!-- If the Model isn't null -->
@if (Model != null)
{
    <!-- Iterate through the menus -->
    foreach (var menu in Model)
    {
        <li>@Html.ActionLink(menu.MenuName, "Details", "Menu", new { id = menu.MenuId })</li>

          <!-- Iterate for each Submenu that corresponds to this menu -->
        foreach (var submenu in menu.SubMenus)
        {
            <a href="#">
                @submenu.SubMenuName
                @Html.ActionLink("SubMenu", "Details", "SubMenu", new { id = submenu.SubMenuId }) |
            </a>
        }
    }
}



Come faccio per visualizzare questa lista nella mia pagina _Layout.cshtml ?

Ho provato con :
@Html.Partial("Menu","Menu")
@Html.Action("Menu","Menu")

Non riesco proprio ad arrivarci?

Se qualcuno riesce ad aiutarmi sarebbe stupendo!!!
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
penso che tu debba definire un'action all'interno del MenuController che sia in grado di passare una lista di Menu3.Models.Menu alla view.

Esempio:
public class MenuController {

  [ChildActionOnly]
  [OutputCache(Duration=60)]
  public ActionResult Stampa(){
    //qui il tuo codice per ottienere la lista delle voci di menu
    IEnumerable<Menu3.Models.Menu> menu = ...;

    //poi restituisco la view come partial
    return PartialView(menu);

  }
}

Dunque abbiamo creato un'action di nome Stampa all'interno del MenuController. Seguendo la convenzione, la tua view dovrà chiamarsi Stampa.cshtml e si dovrà trovare dentro /Views/Menu/.

Ora richiamala dalla pagina di layout in questo modo:
@{Html.RenderAction("Stampa", "Menu");}

Usa Html.RenderAction perché è leggermente più performante di Html.Action, dato che il risultato non ti viene restituito come stringa, ma viene direttamente inviato alla Response.

In sintesi: abbiamo dovuto usare una child action anziché una semplice view parziale perché essa possiede un proprio modello (la lista delle voci di menu), che è diverso da quello della view di contenuto.
Con l'attributo OutputCache, realizziamo quello che si chiama donut-hole caching, per evitare che lo stesso menu debba essere rigenerato per ogni singola richiesta web.
Questo articolo può aiutarti a capire come configurare l'attributo OutputCache, così che tu riesca a controllare il comportamento della cache.
http://www.dotnet-tricks.com/Tutorial/mvc/4R5c050113-Understanding-Caching-in-Asp.Net-MVC-with-example.html

ciao,
Moreno
Modificato da BrightSoul il 18 marzo 2014 08.36 -

Enjoy learning and just keep making
1.495 messaggi dal 27 dicembre 2005
BrightSoul ha scritto:
Ciao,
penso che tu debba definire un'action all'interno del MenuController che sia in grado di passare una lista di Menu3.Models.Menu alla view.

Esempio:
public class MenuController {

  [ChildActionOnly]
  [OutputCache(Duration=60)]
  public ActionResult Stampa(){
    //qui il tuo codice per ottienere la lista delle voci di menu
    IEnumerable<Menu3.Models.Menu> menu = ...;

    //poi restituisco la view come partial
    return PartialView(menu);

  }
}

Dunque abbiamo creato un'action di nome Stampa all'interno del MenuController. Seguendo la convenzione, la tua view dovrà chiamarsi Stampa.cshtml e si dovrà trovare dentro /Views/Menu/.

Ora richiamala dalla pagina di layout in questo modo:
@{Html.RenderAction("Stampa", "Menu");}

Usa Html.RenderAction perché è leggermente più performante di Html.Action, dato che il risultato non ti viene restituito come stringa, ma viene direttamente inviato alla Response.

In sintesi: abbiamo dovuto usare una child action anziché una semplice view parziale perché essa possiede un proprio modello (la lista delle voci di menu), che è diverso da quello della view di contenuto.
Con l'attributo OutputCache, realizziamo quello che si chiama donut-hole caching, per evitare che lo stesso menu debba essere rigenerato per ogni singola richiesta web.
Questo articolo può aiutarti a capire come configurare l'attributo OutputCache, così che tu riesca a controllare il comportamento della cache.
http://www.dotnet-tricks.com/Tutorial/mvc/4R5c050113-Understanding-Caching-in-Asp.Net-MVC-with-example.html

ciao,
Moreno
Modificato da BrightSoul il 18 marzo 2014 08.36 -

La differenza tra i due metodi è che Html.Action eseguue prima una action impostando il relativo Model per poi passarlo alla View, cosa che non fa la Partialview giusto ?
11.886 messaggi dal 09 febbraio 2002
Contributi
Esatto.

In realtà sarebbe possibile fornire un model diverso anche ad una partial, infatti l'helper Html.RenderPartial ha un overload che ha proprio questo scopo.
E' adatto quando la partial view è deputata alla visualizzazione di un oggetto annidato nel Model principale. Ad esempio: se la mia view principale deve presentare un oggetto Person, posso delegare ad una partial la presentazione di suoi indirizzi (Model.Addresses).

Tuttavia in questo caso non possiamo usare Html.RenderPartial, perché la pagina di Layout non possiede proprio alcun model e non è il caso che si metta ad invocare dei metodi di business per ottenere il modello del menu. Non è una responsabilità che compete alle view e quindi, per restare fedeli al pattern MVC, è il caso che di mezzo di ci sia una action.

ciao,
Moreno
Modificato da BrightSoul il 18 marzo 2014 13.17 -

Enjoy learning and just keep making
19 messaggi dal 27 luglio 2009
Ottiom!!!
Grazie per la risposta, ora funziona!!!

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.