Esecuzione di Javascript dopo che è stato impostato il valore selezionato del controllo

StackOverflow https://stackoverflow.com/questions/9341

  •  08-06-2019
  •  | 
  •  

Domanda

Semplice applicazione ASP.NET.

Ho due controlli a discesa.Nel primo menu a discesa ho un JavaScript onChange evento.JavaScript abilita il secondo menu a discesa e rimuove un valore da esso (il valore selezionato nel primo menu a discesa).Se fanno clic sul primo valore vuoto del menu a discesa, il secondo menu a discesa verrà disabilitato (e le opzioni verranno reimpostate).

Ho anche il codice nel file OnPreRender metodo che abiliterà o disabiliterà il secondo elenco a discesa in base al valore del primo elenco a discesa.In questo modo è possibile selezionare nel codice il valore del primo menu a discesa (caricando le impostazioni dell'utente).

Il mio problema è:

  1. L'utente seleziona qualcosa nel primo menu a discesa.Il secondo menu a discesa verrà abilitato tramite JavaScript.
  2. Quindi modificano un terzo menu a discesa che avvia un post indietro.Dopo il postback, i menu a discesa sono nello stato corretto (primo valore selezionato, secondo menu a discesa abilitato).
  3. Se poi fanno clic sul pulsante Indietro, il secondo menu a discesa non sarà più abilitato, anche se dovrebbe esserlo poiché c'è qualcosa selezionato nel primo menu a discesa.

Ho provato ad aggiungere uno script di avvio (che imposterà lo stato corretto del secondo menu a discesa) through ClientScript.RegisterStartupScript, tuttavia, quando viene chiamato, il primo menu a discesa ha un file selectedIndex Di 0, non quello che è in realtà.La mia ipotesi è che il valore della selezione venga impostato dopo il mio script di avvio (ma non chiama ancora il file onChange sceneggiatura).

Qualche idea su cosa provare?

È stato utile?

Soluzione

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
    protected void indexChanged(object sender, EventArgs e)
    {
        Label1.Text = " I did something! ";
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Test Page</title>
</head>
<body>
    <script type="text/javascript">
        function firstChanged() {
            if(document.getElementById("firstSelect").selectedIndex != 0)
                document.getElementById("secondSelect").disabled = false;
            else
                document.getElementById("secondSelect").disabled = true;
        }
    </script>
    <form id="form1" runat="server">
    <div>
        <select id="firstSelect" onchange="firstChanged()">
            <option value="0"></option>
            <option value="1">One</option>
            <option value="2">Two</option>
            <option value="3">Three</option>
        </select>
        <select id="secondSelect" disabled="disabled">
            <option value="1">One</option>
            <option value="2">Two</option>
            <option value="3">Three</option>
        </select>
        <asp:DropDownList ID="DropDownList1" AutoPostBack="true" OnSelectedIndexChanged="indexChanged" runat="server">
            <asp:ListItem Text="One" Value="1"></asp:ListItem>
            <asp:ListItem Text="Two" Value="2"></asp:ListItem>    
        </asp:DropDownList>
        <asp:Label ID="Label1" runat="server"></asp:Label>
    </div>
    </form>
    <script type="text/javascript">
        window.onload = function() {firstChanged();}
    </script>
</body>
</html>

Modificare:Sostituito l'intero codice.Questo dovrebbe funzionare anche sotto il controllo dell'utente.Credo che Register.ClientScriptBlock non funzioni perché il codice che scrivi in ​​quel blocco viene eseguito Prima viene chiamato window.onload.E presumo (non sono sicuro di questo punto) che gli oggetti DOM non abbiano i loro valori impostati in quel momento.Ed è per questo che vieni selezionatoIndice come sempre 0.

Altri suggerimenti

Se il secondo menu a discesa è inizialmente abilitato tramite javascript (suppongo che ciò avvenga durante un onchange javascript, poiché non lo hai specificato), fare clic sul pulsante Indietro per ricaricare il postback precedente non lo abiliterà mai.

Mescolare ASP.NET con Javascript classico può essere complicato.Potresti dare un'occhiata all'implementazione Ajax di ASP.NET (o al controllo AjaxPanel di terze parti se sei costretto a utilizzare una versione ASP.NET precedente).Questi ti daranno il comportamento che desideri attraverso il puro C#, senza costringerti a ricorrere all'hackery-pokery javascript.

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