Ridirezionamento via codice previo controllo dati su AJAX

giovedì 13 maggio 2010 - 16.05

ravalon Profilo | Expert

Salve a tutti...

Tramite un imagebutton , vorrei alla sua pressione valutare alcuni dati....
....se non presenti vorrei che venisse inviato un messaggio tramite RegisterStartutpScript
----se invece ci sono i dati necessari allora vorrei ridirezionare la navigazione verso una pagina precisa che si prende in carico i dati stessi...

Posto un po di codice...

ASPX:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Ho messo sia la proprietà PostBackURL che l'evento OnClick

Ecco poi il code behind

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Mi si vede il messaggio in Javascript solo se non faccio alcun redirect...

Mi fa il redirect solo se uso la proprietà PostBackUrl sul bottone, via codice non me lo fa....

PRECISO CHE il tutto utilizza AJAX.....

Per favore datemi un aiuto perchè da settimane non riesco ad uscirne...grazie

Gluck74 Profilo | Guru

Ciao,

ho capito il problema ma il codice che mi hai mandato non mi è sufficente.
Inoltre, cosa intendi dicendo che "il tutto utilizza ajax?"

In generale, comuqnue, non puoi generare javascript all'interno di un updatePanel (se intendi quello per ajax).
quindi le istruzioni
ScriptManager.RegisterStartupScript
non hanno alcun effetto, se non addiruttura causare errore.

dammi qualche dettaglio in più grazie

ravalon Profilo | Expert

In realtà lo scriptmanager.RegisterStartupScript mi restituisce il messaggio di errore correttamente...il problema è il redirect che funziona solo se uso la proprietà PostScriptUrl sul controllo....e in questo caso pur generandomi l'errore in JS ho problemi di redirect...

Parlo di AJAX ovunque nel senso che la pagina è fatta di diversi Updatepanel, all'interno dei quali ci sono anche dei Panel normali....l'ho specificato perchè so che utilizzando AJAX tante cose vanno gestite in modo specifico....

Devo però dire che in altre pagine ho usato lo stesso metodo, cioè controllare un valore e solo in quel caso svolgere qualcosa altrimenti mandare un mess di errore e funziona, solo che lo fa su se stessa e non verso un'altra pagina.

Dimmi cosa ti serve che te lo fornisco senza problemi...e grazie per il tuo interessamento

Gluck74 Profilo | Guru

ok, ho capito la situazione.

é proprio necessario fare il postbackurl sul pulsante?
Io direi di far scattare l'evento click del pulsante normalmente. fai i tuoi controlli che devi fare.
Se ok fai il redirect, altrimenti fai vedere il messaggio.


dovrebbe essere così:

<asp:ImageButton ID="ImgBtnVaiAllaCassa" runat="server" skinid="btnVaiAllaCassa" ToolTip="<%$Resources:ResourceCatalogo, strVaiAllaCassa%>" OnClick="btnAcquistaControlla" CausesValidation ="false" />


Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

ravalon Profilo | Expert

E' esattamente quello che ho fatto....solo che nel controllo IF THEN non mi fa il redirect sulla pagina che voglio ma solo su se stessa....

l'unico modo in cui fa il redirect è tramite il postbackurl, è questo che non capisco...

Però adesso noto la mancanza di questo pezzo

Handles ImgBtnVaiAllaCassa.Click

nella mia sub sul bottone....

Gluck74 Profilo | Guru

non mi è molto chiaro il perché non ti funzioni.
Se utilizzi la proprietà PostBackUrl, non puoi controllare i dati ed eventualmente stoppare la navigazione se non sono giusti.

Quindi, dovresti rivedere bene il codice e capire come mai il response.redirect non funziona come dovrebbe;
se ti mancava la parte
Handles ImgBtnVaiAllaCassa.Click
probabilmente non veniva proprio richiamata la tua funzione.

ravalon Profilo | Expert

E' proprio per questo che ho chiesto il vostro aiuto, perchè non c'è motivo (apparente) per cui non faccia il redirect....forse perchè la pagina manda dei dati ad un'altra? Ma allora perchè con il postbackurl funziona ?

Secondo te, dove è più probabile che ci sia un errore ?

Gluck74 Profilo | Guru

facicamo così: allegami la pagina con relativo code behind, altrimenti non riesco a capire dove potrebbe essere l'errore.

ciao

ravalon Profilo | Expert

Ti ringrazio per la disponibilità !!

Ecco la aspx

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

ed ecco il code behind

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Può darsi (non ho controllato) che nelle ultime modifiche io abbia ritoccato qualcosa per quanto riguarda la funzione di controllo al click del bottone ma ho fatto tutti i tentativi che ti ho elencato

Gluck74 Profilo | Guru

bello lungo sto codice.......
comunque io l'ho già visto in qualche altro post, di qualche altro utente disperato nel modificare questa pagina. ma arriva da un CMS od un sito OpenSource? Come si chiama?

Tornando al codice:
innanzi tutto hai due funzioni attaccate ad un evento, e questo non andrebbe bene:
Protected Sub ImgBtnVaiAllaCassa_Click(ByVal sender As Object, ByVal e As ImageClickEventArgs) Handles ImgBtnVaiAllaCassa.Click ... ... Public Sub btnAcquistaControlla(ByVal sender As Object, ByVal e As ImageClickEventArgs) Handles ImgBtnVaiAllaCassa.Click
la prima la puoi proprio togliere, non serve a niente.

Dentro la seconda funzione, nel ramo if, hai la seguente riga:
ScriptManager.RegisterStartupScript(Me, Me.GetType, "SpedMancante", "alert('Spedizione mancante!');", True)
come ti dicevo in precedenza, è perfettamente inutile e scorretta poiché siamo dentro un UpdatePanel.

Poi c'è una cosa che, anche se funziona, non i piace per niente:
CodeFile="Carrello.aspx.vb" Inherits="_Default"
Perché la pagina carrello eredita una classe _Default, ovvero, perché il codebehind della pagina carrello costruisce una classe _Default? Non mi piace per niente e tra l'altro è "scorretto" non solo per i puristi del codice.

Il resto, anche se lunghissimo e non l'ho spulciato a fondo, mi sembra ok.

ravalon Profilo | Expert

No era sempre mio....il disperato ero io ! ...molto tempo fa avevo chiesto la stessa cosa ma siccome poi se nessuno ti risponde non puoi riproporre il tema, ho cercato dopo molti mesi di vederlo da un altro punto di vista aprendo un'altra discussione....

Il codice è lungo perchè una sola pagina raccoglie tutte le info ed i dati del carrello....da li si va direttamente all'acquisto avendo tutto sotto controllo prima della conferma anzichè spezzettarlo in più pagine come fanno molti siti...

Ok per le prime due osservazioni, per quanto riguarda l'inherits, cosa dovrei mettere ? Io sono partito dalla prima pagina, la default.aspx, e poi ho clonato la pagina apportando le opportune modifiche..

Se metto Inherits="Catalogo_Carrello" come penso dovrebbe essere ad esempio per la carrello.aspx, mi da un sacco di errore che non finiscono più....

Gluck74 Profilo | Guru

certo che ti da errore, perché il nome deve essere lo stesso di quello della classe nel codebehind.

lascia pure così anche se "semanticamente" non è molto corretto, ma sintatticamente si e quindi funziona.

ciao ciao

ravalon Profilo | Expert

Quindi se faccio combaciare le due cose tutto funziona ? se è più corretto faccio cosi eh...

Ad ogni modo, ho provato le altre due modifiche ma non va....

Forse è meglio se rinuncio e controllo i dati dalla pagina di destinazione...

Gluck74 Profilo | Guru

be, considerando che comunque non riusciresti ad interrompere l'evento di postBack comandato dall'attributo "postbackUrl".....
si, ti conviene fare il controllo nella pagina di destinazione.

Alternativa è quella di torgliere il controllo imageButton e mettere una semplice immagine all'interno di un HyperLink.
Allora avresti una gestione degli eventi leggermente diversa.

ciao

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

ravalon Profilo | Expert

Cioè cosa cambierebbe ? riuscirei a fare quello che voglio fare io, cioè bloccare l'esecuzione fino al verificarsi di un evento ?

Gluck74 Profilo | Guru

scusa, ma prima ho sbagliato il suggerimento.
Non un HyperLink ma un LinkButton.

Praticamente il risultato è questo:

<asp:LinkButton ID="LinkButton1" runat="server" onclick="LinkButton1_Click" oncommand="LinkButton1_Command" > <img src="Images/Calendar_scheduleHS.png" /> </asp:LinkButton>

Come puoi vedere, ti ho lasciato entrambi gli eventi gestibili: onClick e onCommand.
Puoi usare uno di questi per fare i controlli dovuti e se ok, fai il redirect.

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

ravalon Profilo | Expert

Ti ringrazio molto...ma come mai dovrebbe cambiare qualcosa con un link button ?

Gluck74 Profilo | Guru

Ciao,
ti devo chiedere nuovamente scusa perché ti ho dato una risposta non del tutto corretta.

in effetti ho guardato più a fondo, ed entrambi i controlli implementano le stesse interfacce (IPostBackEventHandler, IButtonControl), quindi non fa un gran che di differenza, se non per l'handler e gli args dell'evento.

Prova a mettere come ti ho detto, ovvero un linkButton SENZA postbackUrl, gestire l'evento onCommand e fare il redirect solo se i controlli sono OK.
fammi sapere che succede.

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

ravalon Profilo | Expert

ok, scusami per il ritardo ma ci provo domani, ora sono distrutto...intanto grazie, proverò sicuramente !

ravalon Profilo | Expert

Ciao, ho finalmente capito cosa non andava.....nella pagina di destinazione, cioè ACQUISTA.ASPX, c'era un redirect nel caso che la PreviousPage fosse = nothing....

Ora.... E' necessario per come ho strutturato la cosa che non sia nothing altrimenti non posso estrapolare i dati dalla pagina precedente che mi veicolano i dati l'acquisto dal primo all'ultimo...

Pertanto il redirect ha sempre funzionato, solo che c'era un altro redirect indesiderato che mi riportava indietro....

Quindi mi rimane da capire come fare a passare la PreviousPage durante il redirect.....è possibile ? usando l'oggetto PostBackUrl i dati passavano in automatico, col redirect semplice no....

C'è una soluzione ?

Gluck74 Profilo | Guru

Ciao,
sinceramente ho perso un po il filo, e non mi ricordo come funziona e cosa deve fare la tua pagina.

Comunque, se non sbaglio la previouspage risulta null se viene fatto un redirect, ovvero se non viene fatto un postBack.
Non ne sono totalmente sicuro, quindi controlla questo comando cosa ti restituisce:
Request.UrlReferrer.ToString()
Per quanto riguarda la pagina richiamata dal redirect, potresti utilizzare la direttiva PreviousPage, se viene richiamata sempre dalla stessa pagina.
<%@ PreviousPageType VirtualPath="~/paginaCheFaIlRedirect.aspx" %>

Ciao

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

ravalon Profilo | Expert

ciao, grazie per avermi risposto...

La pagina è un carrello della spesa, che alla pressione di un bottone mi dovrebbe rimandare alla pagina riepilogativa dell'acquisto con tutti i dati che io scelgo provenienti dal carrello...

Quello che sto cercando di fare è verificare la presenza di tutti i dati prima di mandarli alla pagina dell'acquisto....se manca qualcosa avverto l'utente con un messaggio, altrimenti rimando all'acquisto....

Il rimando mi restituisce i dati solo se metto la proprietà postbackurl all'imagebutton, ma cosi facendo non riesco a fare la verifica dei dati perchè mi va di volata alla pagina finale....
...se uso il redirect non va proprio perchè la PreviousPage restituisce null come dicevi tu

Gluck74 Profilo | Guru

quindi devi solo validare il form di inserimento ordine.....
potresti utilizzare i controlli Validator, che fanno una validazione sia server che client.
In questo modo puoi lasciare il postbackUrl all'immagine. La validazione è in carico ai controlli che lato client ti permettono validare il tutto e non permettono l'invio se manca qualcosa.

Dai un'occhiata ai validator (requiredFieldvalidator, regularExpressionValidator, RangeValidato, ValidationSummery)

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

ravalon Profilo | Expert

Giusto, li ho usati comodamente per altre form di altre pagine ma in questo caso mi serviva qualcosa di diverso...

Dato che non ottenevo altre risposte ho fatto una cosa .... ho usato due imagebutton sovrapposti visibili in maniera alternata

....col primo ci faccio i controlli sui dati che vengono scatenati al primo postback
....se vanno bene via codice rendo visibile l'altro imagebutton che ha il postbackurl ed il gioco è fatto....

Un bottone mostra la dicitura "Verifica i dati" e l'altro "Vai alla cassa"...sembra quasi fatto apposta
Non sarà una genialata ma non sapevo più come fare...e comunque sembra che venga bene... Tu che dici ?
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5