170 messaggi dal 17 febbraio 2009
Ciao ragazzi, ho sviluppato un piccolo Custom Control che mi permette di visualizzare un messaggio modale (es: "operazione effettuata correttamente") subito dopo aver fatto click su un linkbutton.

Sto usando jquery dialog, dunque, oltre ad avere uno script jquery da aggiungere alla pagina, devo inserire anche il div con all'interno il testo del messaggio da visualiazzare.

Visto che utilizzo gli update panel (asp.net ajax) se aggiungo il controllo all'oggetto Page, il partial rendering non mi fa vedere il messaggio e lo script non viene eseguito.

la scelta di creare il custom control è dovuta al fatto di poter riutilizzare il controllo in molte parti dell'applicazione.

Approcci consigliati???

ecco il codice del custom control
<ToolboxData("<{0}:ModalMessage runat=server></{0}:ModalMessage>")> _
Public Class ModalMessage
    Inherits WebControl

    Public Property Message As String = "Messaggio di servizio"

    Public Sub New()
    End Sub
    Public Sub New(ByVal message As String)
        Me.Message = message
    End Sub


    Protected Overrides Sub RenderContents(ByVal writer As HtmlTextWriter)
        Dim script = "$(""#jQueryModalMessage"").dialog({close: function (event, ui) { $(this).remove(); }, position: ['right', 'top'], autoOpen: true, show: 'slide', hide: 'slide', dialogClass: 'ui-state-highlight', resizable: false, height: 70 });" &
            "$(""#jQueryModalMessage"").siblings("".ui-dialog-titlebar"").hide();" &
                "if ($(""#jQueryModalMessage"").length > 0) {" &
                    "setTimeout(function () {" &
                        "$(""#jQueryModalMessage"").dialog(""close"");" &
                    "}, 3000);" &
            "}"

        ScriptManager.RegisterStartupScript(Me, Me.GetType, "ModalMessage", script, True)

        writer.Write("<div class=""jQueryModalMessage"" ><span class=""ui-icon ui-icon-info"" style=""float:left;""></span>" & Message & "</div>")
    End Sub

End Class


se non avete ben chiaro qual'è la mia necessità darò ulteriori spiegazioni.

grazie mille come sempre!!
vailfox wrote:
up?!

se ti rispondi da solo, non fai altro che far aumentare il contatore delle risposte. questo, oltre a non servire a niente di per sè, fa sì che, chi è a caccia di domande senza risposta, veda che a te sia stata data. in futuro, insomma, cerca di evitarlo.

quanto al problema, io eviterei di fare così: un custom control in questo caso non serve, perchè è sufficiente piazzare questo codice nella master page, o dove ti pare, e lavorare direttamente con uno stile CSS ad hoc. è questo il bello di jQuery
.

Daniele Bochicchio | ASPItalia.com | Libri
Chief Operating Officer@iCubed
Microsoft Regional Director & MVP
170 messaggi dal 17 febbraio 2009
Daniele Bochicchio ha scritto:
vailfox wrote:
up?!

se ti rispondi da solo, non fai altro che far aumentare il contatore delle risposte. questo, oltre a non servire a niente di per sè, fa sì che, chi è a caccia di domande senza risposta, veda che a te sia stata data. in futuro, insomma, cerca di evitarlo.

quanto al problema, io eviterei di fare così: un custom control in questo caso non serve, perchè è sufficiente piazzare questo codice nella master page, o dove ti pare, e lavorare direttamente con uno stile CSS ad hoc. è questo il bello di jQuery
.


Chiedo scusa per l'up!

Per quanto riguarda il problema, ho adottato la soluzione del Custom Control per avere il tutto centralizzato in un unica classe. In questo modo, se utilizzo la Dialog in "molte" più parti della soluzione e devo fare dei cambiamenti, non devo modificare ogni singola master page o pagina aspx.

Ad ogni modo, potrei inseririre il codice jquery nella master page, ma il problema del "lancio" del messaggio rimane, in quanto, per funzionare, lo script deve puntare ad un div con il testo del messaggio, e io il messaggio lo devo visualizzare da codebehind in base a determinate condizioni (es: nessun ordine trovato).

Vorrei dunque ottenere un qualcosa di "atomico", che con poche righe di codice mi visualizzi la dialog opportuna.

es:
dim dialog as new Dialog("messaggio")
dialog.show()


Potrei anche crearmi una classe statica che mi "spari" il div nella pagina, ma dato che la pagina stessa utilizza il partial rendering, devo scegliere con cura il "posto" in cui piazzare il div, altrimenti anche se aggiunto correttamente, la porzione di pagina specifica non viene aggiornata e il div non viene visualizzato.
fare un custom control per aggiungerlo potrebbe avere senso, benchè secondo me basti in realtà uno user control, così lo centralizzi comunque ma hai meno problemi.

quanto al resto, resto perfettamente possibile fare quello che dici. da codebehind inietti il div e, contestualmente, registri il javascript che fa partire il tuo dialog. una roba tipo "showDialog()", che hai già nella pagina e non fa altro che mostrare come dialog tutti quei div che abbiano una certa classe del CSS. non è complesso e, secondo me, è anche più pulito che registrarlo ogni volta.

Daniele Bochicchio | ASPItalia.com | Libri
Chief Operating Officer@iCubed
Microsoft Regional Director & MVP
170 messaggi dal 17 febbraio 2009
Daniele Bochicchio ha scritto:
è anche più pulito che registrarlo ogni volta.


Intanto ti ringrazio per la risposta esaurinte. Non ho capito se ti riferisci alla registrazione dello script (ogni volta) oppure a quella del controllo??
Perchè poche righe precedenti mi consigli di registrare lo script contestualmente al div, e successivamente affermi che è più pulito che registrarlo ogni volta.

In oltre, rimane il problema del partial rendering, se voglio "atomizzare" il tutto in un unica istruzione, (ModalMessage.ShowDialog("Messaggio")) devo stabilire a priori l'updade panel a cui aggiungero il controllo, in quanto, l'update panel in questione deve essere sempre aggionrnato ad ogni postback asincrono, altrimenti, anche aggiungendo il controllo, questo non verrà visualizzato.

Una buona idea protrebbe essere quella di aggiungere l'update panel nella master page, aggiungere alla master page una proprietà che mi fa accedere direttamente all'update panel, e nella classe statica della modal dialog, nel metodo Show() aggiungere direttamente il controllo all'updatepanel es:

Page.Master.GetUpdatePanel.TemplateControls.Add(ME)

mha... potrebbe funzionare, ma non so quali insidie potrebbe nascondere un approccio del genere...
Modificato da vailfox il 28 gennaio 2011 15.26 -
170 messaggi dal 17 febbraio 2009
Al momento ho risolto in questo modo:

creato l'extension method della classe page,
Public Module ModalAlert

    <System.Runtime.CompilerServices.Extension()> _
    Public Sub ShowModalAlert(ByVal page As Page, ByVal message As String, ByVal container As UpdatePanel)
        Dim div As New HtmlControls.HtmlGenericControl("div")
        div.Attributes("class") = "jQueryModalAlert"
        div.Attributes("title") = "Avviso"
        div.Attributes("style") = "display:none;"
        div.InnerHtml = "<span class=""ui-icon ui-icon-alert"" ""style=""float:left; margin:0 7px 30px 0;display:block;overflow: hidden;""></span>" & message
        container.ContentTemplateContainer.Controls.Add(div)
    End Sub

End Module


lo utilizzo in questo modo:
 Page.ShowModalAlert("Hello World!!", Master.GetMasterUpdatePanel)


gli script jquery sono posizionati nella master page principale (perchè ce ne sono alcune annidate) e vengono eseguiti ad ogni postback e asyncpostback in questo modo:

function pageLoad() {
    $(function () {

        loadJQueryModalAlert();

    });
}

function loadJQueryModalAlert() {
    $(".jQueryModalAlert").dialog({close: function (event, ui) { $(this).remove(); }, autoOpen: true, height: 140, modal: true, resizable: false, width: 'auto', height: 'auto', buttons: { OK: function () { $(this).dialog("close"); } } });
};


è utile sottolineare che nella funzione jquery, all'evento close della modal dialog, rimuovo il div dal DOM, altrimenti ad ogni nuovo messaggio, aggiungerei un altro div e visualizzerei anche quelli precedenti.

Daniele che ne pensi?? era ciò che intendevi ???

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.