ASP.NET ScriptManager Error: this._forum is not a object

1 commento

Mi è capitato alcune volte di ricevere questo errore da una pagina ASP.NET che contiene uno ScriptManager ed un link ad un file JavaScript all’interno del tag Head della pagina, come in questo caso:

[...]
<head runat="server">
    <script type="text/javascript" src="../Scripts/barcode.js" />
</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" />
<div>
[...]

Apparentemente il codice è senza errori, ma eseguendo la pagina in debug si riceve un errore come in figura:

Microsoft JavaScript: Necessario oggetto

Microsoft JavaScript: Necessario oggetto

Cliccando sul tasto “Interrompi”, vado a cercare di capire cosa potrebbe essere successo, e mi accorgo che l’oggetto “_form” della pagina non esiste, ovvero è “null”

Oggetto this._form è "null"

Oggetto this._form è "null"

Inutile raccontarvi quanto tempo ci ho messo a cercare di capire cosa diavolo poteva essere successo, e dove poteva essere un eventuale errore; naturalmente senza successo.

Dopo una puntigliosa ricerca su internet, ho torvato finalmente un articolo che mi ha illuminato e salvato.
Sembra che sia un piccolo bug dell’oggetto ScriptManager, che interpreta male il tag <script /> senza chiusura esplicita.

È bastato modificare il tag ed utilizzare la sintassi canonica per risolvere il tutto:

<head runat="server">
    <script type="text/javascript" src="../Scripts/barcode.js" >
    </script>
</head>

Fine del calvario.

ASP.NET DropDownList Tips: Elenco mesi

Lascia un commento

Spesso capita di dover presentare la possibilità di scegliere un mese dell’anno. Possiamo farlo tramite un Calendario o anche semplicemente tramite una ComboBox.
Ma se il nostro sito è multilingua? Come facciamo a presentare i nomi dei mesi nella lingua giusta?

Il classico (e sbagliato) approccio dei dodici listitem dichiarati esplicitamente, che siano nella pagina ASPX, che siano nel codeBehind, non ci permette di essere “dinamici” rispetto alla lingua utilizzata nel contesto.

<asp:DropDownList ID="ddlMesi" runat="server">
    <asp:ListItem Text="Gennaio" Value="1" />
    <asp:ListItem Text="Febbraio" Value="2" />
    <!-- ... -->
    <asp:ListItem Text="Novembre" Value="11" />
    <asp:ListItem Text="Dicembre" Value="12" />
</asp:DropDownList>

Questo esempio ci fa notare che la visualizzazione dei dati è troppo legata alla scelta dello sviluppatore, e implementa l’esigenza solo per un caso singolo.

Per essere elastici e creare la medesima lista a runtime, e crearla nella lingua utilizzata nel contesto, ecco un piccolo snippet da usare nel codeBehind per una DropDownList vuota:

if (this.ddlMesi.Items.Count <= 1)
    for (int i = 1; i <= 12; i++)
    {
        ddlMesi.Items.Add(new ListItem(
            System.Globalization.DateTimeFormatInfo.CurrentInfo.GetMonthName(i),
            i.ToString()
        ));
    }

Buona visione….