Vra

Ek gebruik jQuery en Eenvoudige modaal in 'n ASP.Net-projek om 'n paar mooi dialoogvensters vir 'n webtoepassing te maak.Ongelukkig kan enige knoppies in 'n modale dialoog nie meer hul terugplasings uitvoer nie, wat nie regtig aanvaarbaar is nie.

Daar is een bron wat ek gevind het met 'n werk om, maar vir my lewe kan ek dit nie laat werk nie, meestal omdat ek nie al die nodige stappe ten volle verstaan ​​nie.

Ek het ook 'n oplossing, dit is om die terugplasings te vervang, maar dit is lelik en waarskynlik nie die betroubaarste nie.Ek sal baie graag weer die postbacks wil laat werk.Enige idees?

OPDATEER:Ek moet dit duidelik maak, die postbacks werk nie omdat die Javascript wat gebruik word om die post backs uit te voer op een of ander manier gebreek het, so niks gebeur glad wanneer die knoppie geklik word nie.

Was dit nuttig?

Oplossing

Beide van julle was op die regte pad.Wat ek besef het, is dat SimpleModal die dialoog aan die liggaam heg, wat buite ASP.Net se <form>, wat die funksionaliteit breek, aangesien dit nie die elemente kan vind nie.

Om dit reg te stel, het ek net die SimpleModal-bron gewysig om alles by te voeg 'form' in plaas van 'body'.Wanneer ek die dialoog skep, gebruik ek ook die persist: true opsie, om seker te maak dat die knoppies deur oop en toe bly.

Dankie almal vir die voorstelle!

OPDATEER: Weergawe 1.3 voeg 'n appendTo opsie in die konfigurasie om te spesifiseer by watter element die modale dialoog aangeheg moet word. Hier is die dokumente.

Ander wenke

Alle standaard ASP.NET postbacks werk deur 'n __doPostBack javascript metode op die bladsy te roep.Daardie funksie dien die vorm in (ASP.NET hou net regtig van een vorm per bladsy) wat een of ander verborge invoerveld insluit waarin al die viewstate en ander goedheid leef.

Op die oog af kan ek niks in SimpalModal sien wat jou bladsy se vorm of enige van die standaard verborge invoere sal opdroog nie, tensy die inhoud van daardie modaal toevallig van 'n HTTP GET na 'n ASP.NET-bladsy gekom het.Dit sal daartoe lei dat twee ASP.NET-vorms in een DOM weergegee word en sal byna seker die __doPostBack-funksie opknapper.

Het jy dit oorweeg om die ASP.NET AJAX ModalPopup beheer?

Webblaaiers sal geen gedeaktiveerde of versteekte vormelemente POST nie.

So wat gebeur is:

  1. Die gebruiker klik op 'n knoppie in jou dialoog.
  2. Die knoppie roep SimpleModal se close() metode, wat die dialoog en die knoppie versteek
  3. Die kliënt POST die vorm (sonder die knoppie se ID)
  4. Die ASP.NET-raamwerk kan nie uitvind watter knoppie geklik is nie
  5. Jou bedienerkant-kode word nie uitgevoer nie.

Die oplossing is om te doen wat jy ook al op die kliënt moet doen (sluit die dialoog in hierdie geval) en dan self __doPostback() te bel.

Byvoorbeeld (waar "dlg" die kliënt-kant SimpleModal dialoog verwysing is):

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

Dit behoort die dialoog te versteek, die vorm in te dien en enige gebeurtenis aan die bedienerkant te noem wat jy vir daardie knoppie het.

@Dan

Alle standaard ASP.NET postbacks werk deur 'n __doPostBack javascript metode op die bladsy te roep.

asp: Knoppies noem nie __doPostback() nie omdat HTML-invoerkontroles reeds die vorm indien.

is uitgevang deur hierdie een - baie dankie aan tghw en al die ander bydraers op die bylaagvorm in plaas van body fix.(opgelos deur eienskappe op die 1.3-weergawe)

btw:As iemand die dialoog programmaties vanaf .net moet toemaak - kan jy hierdie tipe sintaksis gebruik

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

waar die javascript van closedialog so is....

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

Ek het die volgende werke gevind sonder om simplemodal.js te wysig:

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();
    });
}          

Dus, in plaas daarvan om die knoppies in die dialoog te gebruik om die terugstuur te veroorsaak, verhoed jy hul indiening en vind dan 'n versteekte knoppie in die vorm en noem die klikgebeurtenis.

FWIW, ek het die opgedateer blogplasing waarna jy gewys het met kom verduideliking, weer hier geplaas - die redenasie en ander besonderhede is in die blogpos:

Die oplossing (vanaf my laaste inklok voor middagete):

  1. Ignoreer die dialoog se onClose-gebeurtenis en doen die volgende:
    1. Roep die dialoog se verstek Sluit-funksie
    2. Stel die dialoog div se innerHTML op 'n enkele
    3. Kap __doPostBack, wys dit na 'n nuwe funksie, newDoPostBack

Uit sommige opmerkings wat ek op die web gesien het, benodig punt 1 'n bietjie verduideliking.Ongelukkig is ek nie meer by dieselfde werkgewer nie, en het nie toegang tot die kode wat ek gebruik het nie, maar ek sal doen wat ek kan.Eerstens moet jy die dialoog se onClose-funksie ignoreer deur 'n nuwe funksie te definieer en jou dialoog daarna te wys, soos volg:

$('#myJQselector').modal({onClose: mynewClose});
  • Roep die dialoog se verstek Sluit-funksie.In die funksie wat jy definieer, moet jy eers die verstekfunksionaliteit noem ('n beste praktyk vir omtrent enigiets wat jy gewoonlik ignoreer):
  • Stel die dialoog div se innerHTML op 'n enkele– Dit is nie 'n vereiste stap nie, so slaan dit oor as jy dit nie verstaan ​​nie.
  • Kap __doPostBack, wys dit na 'n nuwe funksie, newDoPostBack
function myNewClose (dialog)
{
    dialog.close();
    __doPostBack = newDoPostBack;
}
  1. Skryf die newDoPostBack-funksie:
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();
    }
}
    

Die nuwe Jquery.simplemodal-1.3.js het 'n opsie genaamd appendTo.Voeg dus 'n opsie genaamd appendTo:'form' by, want die verstek is appendTo:'body' wat nie in asp.net werk nie.

Het dieselfde probleem gehad, maar {appendTo:'form'} het veroorsaak dat die modale opspringer heeltemal verkeerd gelewer is (asof ek 'n CSS-probleem gehad het).

Dit blyk dat die sjabloon wat ek bo-op bou, bevat wat ander vorms op die bladsy plaas.Sodra ek gestel het {appendTo:'#aspnetForm'} (die standaard Asp.net-vorm-ID), alles het uitstekend gewerk (insluitend die terugsending).

Benewens tghw se antwoord, het hierdie uitstekende blogpos my gehelp: jQuery:Maak jou terugsendings reg in Modale vorms -- spesifiek BtnMike se opmerking:"U moet ook nie cssClass =" Simplemodal-Close "Stel op u ASP: knoppie hê nie." Die klas van die klas was die nie-voor-die-voor-die-voor-'-oplossing-oplossing.

- Johannes

as jy nie die SimpleModal-bron wil verander nie.probeer hierdie..

Nadat jy die modal() metode geroep het, voeg dit by:

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

die SimpleModal-inprop voeg twee hierdie by jou opmaak.

  1. 'simplemodal-overlay' vir die agtergrond
  2. 'simplemodal-container' bevat die div wat jy wil hê as pop-up modaal.
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top