In un’applicazione ASP.NET Core vi potrà capitare la necessità di avere una porzione di codice html che dovrà essere differente solo in alcune pagine. Un esempio, l’area di amministrazione molto spesso ha un menu diverso dalle pagine pubbliche. Oppure una pagina potrebbe evare una sidebar con alcune immagini al posto del classico menu.

Se già utilizzate ASP.NET Core, sapete benissimo che nel definire una sezione in una pagina di layout, è possibile indicare se questa sia obbligatoria o meno:

@RenderSection("Scripts", required: false)

Ma questo implica che:

  • required: true –> tutte le pagine devono definire tale contenuto. Quindi anche il contenuto di default deve essere definito in ogni singola pagina (o centralizzato in una partial, comunque inserita in ogni pagina)
  • required: false –> alcune pagine definiscono il contenuto della sezione. Vuol dire che quella sezione potrà essere renderizzata o meno. Ma non avrà un contenuto di dafault dove non definita.

Esiste invece una terza strada, ma meno conosciuta.

Uso di IsSectionDefined

All’interno delle pagine Razor (sia View di MVC, sia Razor Pages) è presente il metodo IsSectionDefined che permette di capire se una sezione è stata ridefinita o meno, permettendo di scrivere del codice simile al seguente:

<ul class="navbar-nav flex-grow-1">
    @if (IsSectionDefined(name: "Menu"))
    {
        @RenderSection(name: "Menu")
    }
    else
    {
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
        </li>
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
        </li>
    }
</ul>

Ecco quindi il vantaggio di questa tecnica: centralizzare il rendering di default in un unico punto, facilitando quindi la manutenzione.

Links: