Pergunta

Eu estou usando jQuery e SimpleModal em um ASP.Net projeto para fazer alguns bons diálogos para um aplicativo web.Infelizmente, nenhum dos botões em uma caixa de diálogo modal não pode mais executar suas postbacks, o que realmente não é aceitável.

Existe uma fonte que eu encontrei com um solução alternativa, mas , para a vida de mim eu não posso fazê-lo funcionar, principalmente porque eu não sou totalmente a compreensão de todas as etapas necessárias.

Eu também tenho uma solução, que é a de substituir os postbacks, mas é feio e provavelmente não é o mais confiável.Eu realmente gostaria de fazer os postbacks de trabalho novamente.Qualquer idéias?

ATUALIZAÇÃO:Eu deveria esclarecer, os postbacks não estão funcionando porque o Javascript utilizado para executar o post costas tem rompido de alguma forma, então nada acontece quando o botão é clicado.

Foi útil?

Solução

Ambos estavam no caminho certo.O que eu percebi é que SimpleModal acrescenta o diálogo para o corpo, que está fora ASP.Net's <form>, o que quebra a funcionalidade, uma vez que ele não pode localizar os elementos.

Para corrigir isso, eu só modificou o SimpleModal de origem para acrescentar eveything para 'form' em vez de 'body'.Quando eu criar o diálogo, eu também uso o persist: true opção, para certificar-se de que os botões estadia através da abertura e fechamento.

Obrigado a todos pelas sugestões!

ATUALIZAÇÃO: Versão 1.3 adiciona um appendTo opção de configuração para especificar o elemento ao qual a caixa de diálogo modal deve ser anexada. Aqui estão os docs.

Outras dicas

Todos os padrões de ASP.NET postbacks trabalho chamando um __doPostBack método javascript na página.Essa função envia o formulário (ASP.NET realmente só gosta de um formulário por página), que inclui algumas campo de entrada oculto em que todos os viewstate e outras bondade vidas.

Sobre o rosto dele eu não posso ver nada na SimpalModal que iria estragar sua página de formulário ou de qualquer norma oculta as entradas, a menos que o conteúdo do modal aconteceu a partir de um HTTP GET para um ASP.NET página.Que resultaria em dois ASP.NET formas de ser processado em um DOM e teria quase que certamente iria estragar o __doPostBack função.

Você já pensou em usar o ASP.NET AJAX controle ModalPopup?

Os navegadores da Web não irá publicar qualquer deficiência ou oculto elementos de formulário.

Então, o que está acontecendo é:

  1. O usuário clica em um botão na caixa de diálogo.
  2. O botão chama SimpleModal do método close (), escondendo-se o diálogo e o botão
  3. O cliente envia o formulário (sem IDENTIFICAÇÃO do botão)
  4. O ASP.NET framework não consegue descobrir qual botão foi clicado
  5. O código do lado do servidor não são executados.

A solução é fazer o que você precisa para fazer o cliente (fechar a caixa de diálogo, neste caso) e, em seguida, chamar __doPostback() você mesmo.

Por exemplo (onde "dlg" é o lado do cliente SimpleModal de diálogo referência):

btn.OnClientClick = string.Format("{0}; dlg.close();",
                        ClientScript.GetPostBackEventReference(btn, null));

Que deve ocultar a caixa de diálogo, envie o formulário e chamada independentemente do lado do servidor de eventos para esse botão.

@Dan

Todos os padrões de ASP.NET postbacks trabalho chamando um __doPostBack método javascript na página.

asp:Botões de não chamar __doPostback() porque o HTML controles de entrada, já submeta o formulário.

foi apanhado por isso um muito obrigado a tghw e todos os outros contribuintes sobre a acrescentar a forma em vez do corpo de correcção.(resolvido por atributos na versão 1.3)

btw:Se alguém precisa para fechar a caixa de diálogo por meio de programação de .net - você pode usar este tipo de sintaxe

private void CloseDialog()
{
    string script = string.Format(@"closeDialog()");
    ScriptManager.RegisterClientScriptBlock(this, typeof(Page), UniqueID, script, true);
}

onde o javascript do closedialog é assim....

    function closeDialog() {
        $.modal.close();
    }

Eu encontrei o seguinte funciona sem modificar simplemodal.js:

function modalShow(dialog) {

    // if the user clicks "Save" in dialog
    dialog.data.find('#ButtonSave').click(function(ev) {
        ev.preventDefault();

        //Perfom validation                

        // close the dialog
        $.modal.close();

        //Fire the click event of the hidden button to cause a postback
        dialog.data.find('#ButtonSaveTask').click();
    });

    dialog.data.find("#ButtonCancel").click(function(ev) {
        ev.preventDefault();
        $.modal.close();
    });
}          

Assim, em vez de usar os botões na caixa de diálogo para causar o postback você impede que seu submeter e, em seguida, encontrar um botão escondido no formulário e chamar o evento de clique.

FWIW, eu atualizei o post de blog que você apontou para com o esclarecimento, repostado aqui - o raciocínio e outros detalhes estão no post do blog:

A solução (como o meu último check-in antes do almoço):

  1. Substituir a caixa de diálogo do evento onClose, e faça o seguinte:
    1. Chamada a caixa de diálogo padrão da função Fechar
    2. Defina a caixa de diálogo div innerHTML para um único
    3. Seqüestrar __doPostBack, apontando para uma nova função, newDoPostBack

A partir de alguns comentários que eu vi na web, o ponto 1, necessita de alguns esclarecimentos.Infelizmente, não estou mais com o mesmo empregador, e não ter acesso ao código que eu usei, mas vou fazer o que posso.Primeiro, você precisa para substituir o diálogo onClose função através da definição de uma nova função, e apontando o diálogo para isso, como este:

$('#myJQselector').modal({onClose: mynewClose});
  • Chamada a caixa de diálogo padrão da função de Fechar.Em função definida, você deve primeiro chamar a funcionalidade padrão (uma prática recomendada para qualquer coisa que você substituir normalmente):
  • Defina a caixa de diálogo div innerHTML para um único – Este não é um passo necessário, portanto, ignorá-lo se você não entende isso.
  • Seqüestrar __doPostBack, apontando para uma nova função, newDoPostBack
function myNewClose (dialog)
{
    dialog.close();
    __doPostBack = newDoPostBack;
}
  1. Escreva a newDoPostBack função:
function newDoPostBack(eventTarget, eventArgument)
{
    var theForm = document.forms[0];
    if (!theForm)
    {
        theForm = document.aspnetForm;
    }
 
    if (!theForm.onsubmit || (theForm.onsubmit() != false))
    {
        document.getElementById("__EVENTTARGET").value = eventTarget;
        document.getElementById("__EVENTARGUMENT").value = eventArgument;
        theForm.submit();
    }
}
    

O novo Jquery.simplemodal-1.3.js tem uma opção chamada acrescentar.Para adicionar uma opção chamada acrescentar:'formulário', porque o padrão é acrescentar: "corpo" que não funciona no asp.net.

Tive o mesmo problema, mas {appendTo:'form'} causou o modal popup para ser processado completamente errado (como se eu tivesse uma questão CSS).

Acontece que o modelo que eu estou construindo em cima do que inclui colocar outras formas na página.Assim que eu definir {appendTo:'#aspnetForm'} (o padrão Asp.net ID do formulário), tudo funcionou muito bem (inclusive o postback).

Além tghw a resposta, este excelente post do blog me ajudaram: jQuery:Corrigir o seu postbacks em formulários de janela Restrita -- especificamente BtnMike do comentário:"Você também não deve ter CssClass="simplemodal-fechar" definido no asp:button". Tendo que fora da classe, e o não-óbvio para mim a solução.

-João

se você não quiser modificar o SimpleModal de origem.tente isso..

Depois de chamar o modal() método adicione isso:

$("#simplemodal-overlay").appendTo('form');
$("#simplemodal-container").appendTo('form');

o SimpleModal plugin adicionar isso à sua marcação.

  1. 'simplemodal-sobreposição' para o plano de fundo
  2. 'simplemodal-recipiente", que contém a div que você whant como pop-up modal.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top