Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it L'avatar di cassano
    Registrato dal
    Aug 2004
    Messaggi
    3,002

    [asp.net 4.0] Evitare postback multipli

    Ciao a tutti , io utilizzo questo codice per disabilitare un bottoner per tutta la durata del postback :

    codice:
    "if(typeof(Page_ClientValidate)=='function' && !Page_ClientValidate()){return false;}" + "this.value='Ricerca in corso..';" + "this.disabled=true;" + ClientScript.GetPostBackEventReference(cerca, "") + ";"
    e cosi funziona correttamente.
    Il problema è che ora questo bottone viene usato per esportare una griglia in excel, e dato che la routine di esportazione si conclude con un response.end, il bottone non si riabilita fino a che non eseguo un altro postback.

    C'è un modo per riabilitarlo ???

  2. #2
    si, con javascript.

    Puoi disabilitare il bottone appena viene premuto (onclick="this.disabled=true"), così al postback si riabilita da solo

    oppure

    al body onload='<% = "document.getElemetById('" & bottone.UniqueID & "').disabled=false;" %>'
    (usando vb.net, per C# cambia i & con i +)

    Ciao,
    b.

  3. #3
    Utente di HTML.it L'avatar di cassano
    Registrato dal
    Aug 2004
    Messaggi
    3,002
    Ma il problema è che con il response.end finale al caricamento del body non ci arriverai mai.

  4. #4
    Originariamente inviato da cassano
    Ma il problema è che con il response.end finale al caricamento del body non ci arriverai mai.
    Response.ContentType = "application/vnd.ms-excel"
    Response.ContentEncoding = System.Text.Encoding.GetEncoding(0)
    Response.AddHeader("content-disposition", "inline; filename=TuoFileExcel.xls")
    Response.Charset = String.Empty
    Response.Write(sExcel)
    Response.End()

    in questa riga:
    Response.AddHeader("content-disposition", "inline; filename=TuoFileExcel.xls")
    dichiari di voler allegare un file al caricamento della pagina.
    la pagina e il suo body viene caricato assieme al download del file.

    Ciao,
    b.

  5. #5
    Utente di HTML.it L'avatar di cassano
    Registrato dal
    Aug 2004
    Messaggi
    3,002
    Scusami ma con "inline" se non sbaglio apre il file excel dentro explorer e non fa apparire la classica finestrella per il download.
    Io ho provato il tuo codice, ma dopo il response.end si vede il file excel ma non si abilita il bottone,il postback non viene completato e quindi ,credo,il body non viene caricato.

    Domani vedo di fare una paginetta semplice semplice che fa quello che dici te e vediamo.

    Intanto grazie mille. .

    ps.

    aspetta per adesso sto notando che tu non hai messo in cima il response.clear, forse è questo che cambia tutto ????.

  6. #6
    Originariamente inviato da cassano
    aspetta per adesso sto notando che tu non hai messo in cima il response.clear, forse è questo che cambia tutto ????.
    Beh, con response.clear() svuoti il buffer di "risposta" della pagina, quindi il primo header che viene successivamente impostato (application/Excel) e' quello che determina il content type dell' output.
    Ergo: ciao browser, ora ti mando un Excel e basta.
    Se invece NON fai il clear, la pagina viene renderizzata e con essa anche il file allegato.
    Effettivamente dovrebbe aprirsi Excel se e' installato sulla macchina, altrimenti il browser dovrebbe chiederti di scegliere quale applicazione utilizzare per visualizzare il file.

    Ciao,
    b.

  7. #7
    Utente di HTML.it L'avatar di cassano
    Registrato dal
    Aug 2004
    Messaggi
    3,002
    Ok però ho notato una cosa, non mettendo il response.clear, nel foglio excel vengono renderizzati anche i controlli presenti nella pagina.....cosa che devo assolutamente evitare.

  8. #8
    ??
    dipende da cosa butti nell'output.
    A questo punto sarebbe bello vedere un pò di codice, giusto per sapere che sistema stai usando

    ciao,
    b.

  9. #9
    Utente di HTML.it L'avatar di cassano
    Registrato dal
    Aug 2004
    Messaggi
    3,002
    Eccolo qui , è ripreso da un esempio in rete :

    codice:
    Public Class GridViewExportUtil
    
        Public Shared Sub Export(ByVal fileName As String, ByVal gv As GridView)
            HttpContext.Current.Response.Clear()
            HttpContext.Current.Response.AddHeader("content-disposition", String.Format("attachment; filename={0}", fileName))
            HttpContext.Current.Response.ContentType = "application/ms-excel"
            Dim sw As StringWriter = New StringWriter
            Dim htw As HtmlTextWriter = New HtmlTextWriter(sw)
            '  Create a form to contain the grid
            Dim table As Table = New Table
            table.GridLines = gv.GridLines
            '  add the header row to the table
            If (Not (gv.HeaderRow) Is Nothing) Then
                GridViewExportUtil.PrepareControlForExport(gv.HeaderRow)
                table.Rows.Add(gv.HeaderRow)
            End If
            '  add each of the data rows to the table
            For Each row As GridViewRow In gv.Rows
                GridViewExportUtil.PrepareControlForExport(row)
                table.Rows.Add(row)
            Next
            '  add the footer row to the table
            If (Not (gv.FooterRow) Is Nothing) Then
                GridViewExportUtil.PrepareControlForExport(gv.FooterRow)
                table.Rows.Add(gv.FooterRow)
            End If
            '  render the table into the htmlwriter
            table.RenderControl(htw)
            '  render the htmlwriter into the response
            HttpContext.Current.Response.Write(sw.ToString)
            HttpContext.Current.Response.End()
        End Sub
    
        ' Replace any of the contained controls with literals
        Private Shared Sub PrepareControlForExport(ByVal control As Control)
            Dim i As Integer = 0
            Do While (i < control.Controls.Count)
                Dim current As Control = control.Controls(i)
                If (TypeOf current Is LinkButton) Then
                    control.Controls.Remove(current)
                    control.Controls.AddAt(i, New LiteralControl(CType(current, LinkButton).Text))
                ElseIf (TypeOf current Is ImageButton) Then
                    control.Controls.Remove(current)
                    control.Controls.AddAt(i, New LiteralControl(CType(current, ImageButton).AlternateText))
                ElseIf (TypeOf current Is HyperLink) Then
                    control.Controls.Remove(current)
                    control.Controls.AddAt(i, New LiteralControl(CType(current, HyperLink).Text))
                ElseIf (TypeOf current Is DropDownList) Then
                    control.Controls.Remove(current)
                    control.Controls.AddAt(i, New LiteralControl(CType(current, DropDownList).SelectedItem.Text))
                ElseIf (TypeOf current Is CheckBox) Then
                    control.Controls.Remove(current)
                    control.Controls.AddAt(i, New LiteralControl(CType(current, CheckBox).Checked))
                    'TODO: Warning!!!, inline IF is not supported ?
                End If
                If current.HasControls Then
                    GridViewExportUtil.PrepareControlForExport(current)
                End If
                i = (i + 1)
            Loop
        End Sub

  10. #10
    ok, a quanto ho capito il codice che hai postato trasforma un controllo gridview ed il suo contenuto in qualcosa di statico da far leggere ad excel.

    Personalmente non condivido questo metodo, perchè utilizza una funzione ricorsiva (PrepareControlForExport) che potenzialmente può rallentare di brutto l'esecuzione, ma questo è un altro discorso.

    A questo punto è chiaro: il response.clear all'inizio della funzione serve per mandare in output solo il file excel.

    Prova a integrare questo codice con quello che ti ho postato io, ricordandoti di sostituire
    String.Format("attachment; filename={0}", fileName)
    con
    String.Format("inline; filename={0}", fileName)

    e fammi sapere che succede.

    Ciao,
    b.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.