Domanda

Sto usando una casella di testo ASP.NET con il datepicker dell'interfaccia utente jQuery. La casella di testo consente le modifiche in modo che l'utente possa inserire una data manualmente o cancellare una voce esistente. Ho aggiunto un CompareValidator per eseguire un controllo del tipo di dati nella casella di testo e questo provoca un errore dopo aver selezionato una data con il datepicker. L'errore si verifica nella convalida lato client ASP.NET:

Microsoft JScript runtime error: 'length' is null or not an object

l'errore si verifica in ValidatorOnChange. Come posso risolvere questo problema? È possibile utilizzare datepicker con i controlli validatore ASP.NET?

Il mio markup è:

<asp:Label runat="server" AssociatedControlID="uxInstallDate">Install Date</asp:Label>
<asp:TextBox ID="uxInstallDate" runat="server" Columns="10" />
<asp:CompareValidator runat="server" ControlToValidate="uxInstallDate" Operator="DataTypeCheck" Type="Date" Text="*" ErrorMessage="Install Date must be a date." Display="Dynamic" />

Nota che l'attributo ID mancante in CompareValidator è intenzionale e aggiungerlo non fa differenza. La mia inizializzazione jQuery è:

$(document).ready(function() {
    $("#<%= uxInstallDate.ClientID %>").datepicker({ changeMonth: true });
});
È stato utile?

Soluzione

Penso di aver trovato una soluzione. Questo è un bug che si verifica in IE, non in Firefox (non ho testato nessun altro browser). La soluzione consisteva nel sovrascrivere il metodo onSelect nell'inizializzazione:

$("#<%= uxInstallDate.ClientID %>").datepicker({ changeMonth: true, onSelect: function() { } });

Ho trovato una descrizione del problema e la soluzione qui e una soluzione alternativa qui .

Altri suggerimenti

Basati sulla soluzione di Jamie e l'alternativa soluzione che fornisce, ecco la mia soluzione alternativa per aggirare questo strano bug che si verifica solo con IE.

Presumo che una data selezionata dal controllo datepicker sia una data valida, quindi nascondo il messaggio o l'errore di immagine di CompareValidator se è visibile.

$(".myControl").datepicker({
    onSelect: function() {
        if ($.browser.msie) {
            if ($(this).next("span").css("display") != "none") {
                $(this).next("span").css("display", "none");
            }
        }
        else {
            $(this).trigger('change');
        }
    }
 });

Spero che aiuti

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top