none
Postback en botón SP.UI.ModalDialog.commonModalDialogClose RRS feed

  • Pregunta

  • Buenos días.

    Actualmente estoy usando una ventana modal de confirmación. De qué manera puedo asociar codebehind a un botón que está en el div? Actualmente le tengo asociado un eventhandler, sin embargo, el botón no me hace postback, si saco el botón del div si se ejecuta el postback.

    Muchísimas gracias.

    • Editado Waly13 viernes, 27 de diciembre de 2013 18:31
    viernes, 27 de diciembre de 2013 18:25

Respuestas

  • Hola Waly13,

    A ver lo que esta ocurriendo en el desarrollo que has puesto es que primero cierra la ventana modal por lo tanto no se ejecuta el codigo behind que tienes en el click. 

    Para el uso del SP.ModalDialog la situación "ideal" es que tu hagas lo que quieras hacer en caso afirmativo en el momento que el foco te vuelva a la página de inicio , puedes mirar este ejemplo http://blogs.msdn.com/b/aiturralde/archive/2012/05/15/utilizando-los-modal-dialogs-de-sharepoint-2010-tip-ui-3.aspx

    Ahora bien mediante programación a tu código lo que puedes hacer es que primero ejecutes el codigo behind y después cierres el formulario. Para hacerlo en el boton no pondria el onclientclick y en su lugar verificaria un parametro en la QueryString en el momento que se cargue la pagina (debido a que cuando haces un click en servidor vas a recargar la página). Esta es la opción para adaptarlo a tu desarrollo pero te recomiendo que el código que quieras poner lo realices en la vuelta del formulario. Sino es mucha curiosidad que es lo que necesitas ejecutar? Lo comento más que nada porque casi todo lo que puedes hacer en servidor lo puedes hacer en cliente.

    Ya comentas cualquier duda. 

    Un saludo,


    MCPD SharePoint 2010 Mi blog: http://blogs.encamina.com/desarrollandosobresharepoint Twitter: @AdrianDiaz81

    • Marcado como respuesta Waly13 jueves, 2 de enero de 2014 20:16
    jueves, 2 de enero de 2014 11:40

Todas las respuestas

  • Hola Waly13,

    Puedes explicar un poco más lo que estas intentando hacer es que no entiendo tu funcionamiento. Me explico cuando abres un formulario modal en SharePoint, lo que puedes es controlar es si se ha aceptado o rechazado lo que hay en la ventana modal, por lo que no entiendo que tiene que ver el div en esta parte. Y otra parte de lo que no entiendo es si tu añades un eventhandler este reacciona a un funcionamiento sobre algo elemento de SharePoint (lista, item, web,etc.. ) pero no al abrir o cerrar una ventana modal.

    Cuentanos un poco y te intento ayudar.

    Un abrazo


    MCPD SharePoint 2010 Mi blog: http://blogs.encamina.com/desarrollandosobresharepoint Twitter: @AdrianDiaz81

    domingo, 29 de diciembre de 2013 17:24
  • Buenos días Adrian, muchas gracias por responder.

    Actualmente estoy programando un mensaje de confirmación con el API de SharePoint SP.UI.ModalDialog.commonModalDialogClose, el cual sale a manera de popup. Este tiene dos botones: "Aceptar" y "Cancelar". La idea es que al dar clic en el botón "Cancelar" no se ejecute código, y al dar clic en "Aceptar" se ejecute parte de mi código. A continuación parte del código:

    -- Este es el div del mensaje modal resultante.

    <div id="msgConfirmacion" style="display:none; height: 100%;">
            <table class="table" style="height: 100%;">
                <tr>
                    <td>
                        <asp:Image ID="imgMsgConfirmacion" runat="server" Width="64px" Height="64px" />
                    </td>
                    <td>
                        <asp:Label ID="lblCuerpoMensaje" runat="server" />
                    </td>
                </tr>
                <tr valign="bottom" style="height: 10%;">
                    <td colspan="2" align="center">
                        <asp:Button ID="btnConfirmacionNoProcede" runat="server" Text="Aceptar" CssClass="buttonPopUp" OnClientClick='SP.UI.ModalDialog.commonModalDialogClose(1, SP.UI.DialogResult.ok);'
                            Style="margin: 10px 10px 5px 10px" OnClick="btnConfirmacionNoProcedeOnclick" />
                        <asp:Button ID="Button45" Text="text" runat="server" OnClick="clicPrueba"
                        CausesValidation="false" UseSubmitBehavior="true" />
                        <input type="button" value="Cancelar" class="buttonPopUp" onclick='SP.UI.ModalDialog.commonModalDialogClose(0, SP.UI.DialogResult.cancel);'
                            style="margin: 10px 10px 5px 10px" />
                    </td>
                </tr>
            </table>
        </div>

    Como pueden ver tengo dos botones y un input, el segundo botón es de prueba, el real es el primero. La idea es que en el evento OnClientClick me ejecute código javascript y en el evento OnClick me ejecute codebehind. A continuación mi código javascript:

    function popUpConfirmacion() {
                var targetDiv = document.getElementById('msgConfirmacion');
                $('[id$=lblCuerpoMensaje]').text("<%=MensajeConfirmacion003 %>");
                targetDiv5 = targetDiv.cloneNode(true);
                $('[id$=lblCuerpoMensaje]').text("");
                targetDiv5.style.display = '';
                return SP.UI.ModalDialog.showModalDialog({ title: 'Confirmación', width: 330, height: 150, html: targetDiv5, dialogReturnValueCallback: Function.createDelegate(null, CloseCallback2), allowMaximize: false });
            }

            function CloseCallback2(dialogResult, returnValue) {
                if (dialogResult == SP.UI.DialogResult.OK) {
                    SP.UI.ModalDialog.commonModalDialogClose(SP.UI.DialogResult.OK);
                    alert('returnValue: ' + returnValue);
                    //RedirectHomeOnCloseCallback();
                    return true;
                }
                if (dialogResult == SP.UI.DialogResult.cancel) {
                    SP.UI.ModalDialog.commonModalDialogClose(SP.UI.DialogResult.Cancel);
                    alert('returnValue: ' + returnValue);
                    return false;
                }
            }

    Al dar clic en el botón Aceptar debe ejecutar el siguiente código (sin sentido por ahora):

    protected void clicPrueba(object sender, EventArgs e)
            {
                string a = string.Empty;
            }

    Mi problema es que no entra al método clicPrueba.

    Muchísimas gracias,

    Saludos

    lunes, 30 de diciembre de 2013 13:32
  • Hola Waly13,

    A ver lo que esta ocurriendo en el desarrollo que has puesto es que primero cierra la ventana modal por lo tanto no se ejecuta el codigo behind que tienes en el click. 

    Para el uso del SP.ModalDialog la situación "ideal" es que tu hagas lo que quieras hacer en caso afirmativo en el momento que el foco te vuelva a la página de inicio , puedes mirar este ejemplo http://blogs.msdn.com/b/aiturralde/archive/2012/05/15/utilizando-los-modal-dialogs-de-sharepoint-2010-tip-ui-3.aspx

    Ahora bien mediante programación a tu código lo que puedes hacer es que primero ejecutes el codigo behind y después cierres el formulario. Para hacerlo en el boton no pondria el onclientclick y en su lugar verificaria un parametro en la QueryString en el momento que se cargue la pagina (debido a que cuando haces un click en servidor vas a recargar la página). Esta es la opción para adaptarlo a tu desarrollo pero te recomiendo que el código que quieras poner lo realices en la vuelta del formulario. Sino es mucha curiosidad que es lo que necesitas ejecutar? Lo comento más que nada porque casi todo lo que puedes hacer en servidor lo puedes hacer en cliente.

    Ya comentas cualquier duda. 

    Un saludo,


    MCPD SharePoint 2010 Mi blog: http://blogs.encamina.com/desarrollandosobresharepoint Twitter: @AdrianDiaz81

    • Marcado como respuesta Waly13 jueves, 2 de enero de 2014 20:16
    jueves, 2 de enero de 2014 11:40
  • Buenas tardes Adrian.

    Muchas gracias por responder. También fue muy útil el ejemplo y me dejó más claro el panorama.
    Finalmente en lugar de usar el querystring, usé un hiddenField de Asp tal como lo hacen en este link

    Lo que requería hacer es una actualización de un requerimiento almacenado en una biblioteca de SharePoint, que aunque sé que lo hubiera podido solucionar por medio de javascript, no me servía la solución debido al modelo que estamos usando en la solución (Modelo Vista Presentador), y esta porción de código se debe implementar en el modelo.

    Por ahora ya me funciona de la siguiente manera:

    function CloseCallback2(dialogResult, returnValue) {
                if (dialogResult == SP.UI.DialogResult.OK) {
                    hidden = document.getElementById('<%= this.hdfNoProcede.ClientID %>');
                    if (hidden != null) {
                        if (hidden.value != "0") {
                            hidden.value = "0";
                        }
                        else {
                            hidden.value = "1";
                        }
                        __doPostBack('<%= this.updHidden.ClientID %>', "cmdSend");
                    }
                    SP.UI.ModalDialog.commonModalDialogClose(SP.UI.DialogResult.OK);
                    return true;
                }
                if (dialogResult == SP.UI.DialogResult.cancel) {
                    SP.UI.ModalDialog.commonModalDialogClose(SP.UI.DialogResult.Cancel);
                    return false;
                }
            }

    En la página aspx tengo lo siguiente:

    <div id="msgConfirmacion" style="display:none; height: 100%;">
            <table class="table" style="height: 100%;">
                <tr>
                    <td>
                        <asp:Image ID="imgMsgConfirmacion" runat="server" Width="64px" Height="64px" />
                    </td>
                    <td>
                        <asp:Label ID="lblCuerpoMensaje" runat="server" />
                    </td>
                </tr>
                <tr valign="bottom" style="height: 10%;">
                    <td colspan="2" align="center">
                        <asp:Button ID="btnConfirmacionNoProcede" runat="server" Text="Aceptar" CssClass="buttonPopUp" OnClientClick='SP.UI.ModalDialog.commonModalDialogClose(1, SP.UI.DialogResult.ok);'
                            Style="margin: 10px 10px 5px 10px" OnClick="btnConfirmacionNoProcedeOnclick" />
                        <input type="button" value="Cancelar" class="buttonPopUp" onclick='SP.UI.ModalDialog.commonModalDialogClose(0, SP.UI.DialogResult.cancel);'
                            style="margin: 10px 10px 5px 10px" />
                    </td>
                </tr>
            </table>
        </div>
        <asp:UpdatePanel runat="server" ID="updHidden" UpdateMode="Always">
            <ContentTemplate>
            <asp:HiddenField runat="server" ID="hdfNoProcede" onvaluechanged="hdfNoProcede_ValueChanged" Value="0"/>
            </ContentTemplate>
        </asp:UpdatePanel>

    Y en el codebehind tengo lo siguiente:

    protected void hdfNoProcede_ValueChanged(object sender, EventArgs e)
            {
                Mapper mapper = new Mapper();
                List<IEntity> entidad = new List<IEntity>();
                EFase fase = new EFase();
                fase.EstadoFlujo = "No Procede";
                entidad.Add(fase);
                mapper.ActualizarRequerimiento(EncapsulatedSessionVariables.RequirementDTO.IdGRequerimiento, entidad);
                Response.Redirect(SPContext.Current.Web.Url);
            }

    jueves, 2 de enero de 2014 20:16