Domanda

Ho un ListView che contiene le playlist. Se l'utente vuole modificare un album, si clicca sul link Modifica e permette loro di rimuovere o aggiungere brani alla playlist. Se l'utente vuole salvare una nuova playlist, mantenendo quella originale, l'aspirante fare clic su un pulsante Salva con nome. Ecco cosa dovrebbe accadere:

Se l'utente fa clic su Salva con nome e non hanno cambiato il nome, voglio visualizzare un avviso dicendo loro che devono cambiare il nome.

Se l'utente fa clic Salva con nome e hanno cambiato il nome, voglio visualizzare una conferma che in realtà vogliono salvarla.

Al momento, ciò che sta accadendo è che se metto qualcosa di simile al seguente nel mio codice dietro, lo script non registra fino al secondo scatto e tutto ciò che lo script è stato registrato soggiorni significato registrato che se finisco cambiare il nome e l'avviso sceneggiatura è stata registrata in precedenza, verrà visualizzato l'avviso al posto della conferma. Ecco il codice:

if (newname == oldname)
{
    btnSaveAs.OnClientClick =
  "javascript:alert('Save As requires you to change the name of the playlist. Please
   change the name and try again.');";
}
else
{
    btnSaveAs.OnClientClick = "javascript:confirm('Are you sure you want to save the
    playlist" + newname + "?');";
}

Inoltre ho provato ad aggiungere il ritorno falso in modo che non avrebbe fatto un postback, ma se lo faccio, allora non in realtà non fare nulla quando si fa clic su OK nella conferma.

È stato utile?

Soluzione

Che SLaks detto è corretto, si sta fraintendendo la pagina di ciclo di vita. Il codice javascript deve essere a posto nella pagina prima si fa clic su Salva con nome. Nel tuo esempio come descritto, l'utente apporta modifiche al titolo / nome e fa clic su Salva con nome, dopo di che il codice JavaScript viene applicata al pulsante. La seconda volta si fa clic su Salva con nome, i risultati della convalida dell'esempio precedente pop-up.

Opzione 1: Utilizzare un controllo di convalida

Il modo più semplice per risolvere questo è quello di utilizzare un controllo RegularExpressionValidator per confrontare i valori.

Markup frammento:

<asp:Label ID="lblName" runat="server" Text="Name: " />
<asp:TextBox ID="txtName" runat="server" />
<asp:RegularExpressionvalidator ID="valName" runat="server" ControlToValidate="txtName" ErrorMessage="You must change the name before saving" Display="Dynamic" />

<asp:Button ID="btnSaveAs" runat="server" OnClick="btnSaveAs_Click" Text="Save As" CausesValidation="True" />

Nel codice-dietro una volta che i campi del modulo (nome album, ecc) sono tenuti, eseguire questo:

valName.ValidationExpression = string.Format("[^{0}]", Regex.Escape(lblName.Text));

L'espressione regolare sopra sarà valido per qualsiasi ingresso, tranne ciò che era lì per cominciare. Se l'utente modifica il testo per il nome dell'album, il pulsante di salvataggio convaliderà correttamente. Se non lo fanno, il validatore entreranno in gioco e visualizzare un messaggio sulla pagina dicendo che hanno di cambiarlo.

Poi gestire l'evento OnClick del pulsante di salvataggio solo per salvare i valori, perché sarà il fuoco solo se la pagina è stato convalidato:

protected void btnSaveAs_Click(object sender, EventArgs e)
{
    if (Page.IsValid)
    {
        //do you save actions as needed
    }
}

È anche possibile continuare a utilizzare la tua casella di conferma, come si voleva, facendo:

protected void Page_Load(object sender, EventArgs e)
{
    btnSave.OnClientClick = "return confirm('Are you sure you wish to change the name?');";
}

È possibile che questo dovrebbe funzionare bene. Un approccio alternativo è riportato di seguito:

Opzione 2: Utilizzare una funzione di validazione lato client

Se si voleva fare la validazione lato client completamente, si potrebbe ma sarà molto più complicato. Cosa avresti bisogno di fare, è registrare una funzione di validazione lato client completamente.

Nel codice dietro durante Page_PreRender:

protected void Page_PreRender(object sender, EventArgs e)
{
    //define the script
    string script = @"

    function validateAlbumName(oldName, textBoxId) {

        //get the textbox and its new name
        var newName = document.GetElementById(textBoxId).value;

        //compare the values 
        if (newName === oldName) {
            //if the name hasn't changed, 
            alert('You must change the name of the album');
            return false;
        }

        return confirm ('Are you sure you want to save the playlist ' + newName);  
    }

    ";

    //register the client script, so that it is available during the first page render
    Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "SaveAsValidation", script);

    //add the on client click event, which will validate the form fields on click the first time.
    btnSaveAs.OnClickClick = string.Format("return validateAlbumName('{0}','{1}');", txtAlbumName.Text, txtAlbumName.ClientID);

}

Spero che questo aiuti. Ci sono probabilmente alcuni errori di sintassi in quanto sopra come ho appena buttato insieme in fretta ..

Altri suggerimenti

La proprietà OnClientClick è una stringa Javascript, non è un URI. Di conseguenza, non si dovrebbe cominciare con javascript:.

Per gestire la confirm correttamente, scrivere OnClientClick = "return confirm('Are you sure?');";

Inoltre, si sta fraintendendo il modello di pagina di ASP.Net.

Il vostro C # code-behind gestore di eventi viene eseguito solo dopo l'utente fa clic sul pulsante e dopo la richiamata OnClientClick. Hai bisogno di scrivere tutto questo in Javascript e chiamarlo in OnClientClick.

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