SimpleModal quebras de ASP.Net Postbacks
-
09-06-2019 - |
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.
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 é:
- O usuário clica em um botão na caixa de diálogo.
- O botão chama SimpleModal do método close (), escondendo-se o diálogo e o botão
- O cliente envia o formulário (sem IDENTIFICAÇÃO do botão)
- O ASP.NET framework não consegue descobrir qual botão foi clicado
- 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):
- Substituir a caixa de diálogo do evento onClose, e faça o seguinte:
- Chamada a caixa de diálogo padrão da função Fechar
- Defina a caixa de diálogo div innerHTML para um único
- 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;
}
- 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.
- 'simplemodal-sobreposição' para o plano de fundo
- 'simplemodal-recipiente", que contém a div que você whant como pop-up modal.