2012-07-19 7 views
12

Ich habe eine Visualforce-Seite, die auf der Detailseite der Möglichkeiten eingebettet ist.Visual Seite in einer Detailseite eingebettet, die auf anderer Seite umgeleitet werden muss

innerhalb der Seite ist eine Befehlsschaltfläche, die ein Verfahren, in dem Trägerreglerneben aufruft.

Sobald die Trägerverfahren abgeschlossen ist, wie kann ich den Benutzer auf eine andere Seite umleiten?

Ich kann einen PageReference aus dem Verfahren zurück, sondern es wird nur die iframe umleiten, die die eingebettete Seite Visual in angezeigt wird.

Im Idealfall würde Ich mag die Top-Level-Fenster aktualisieren, aber ich bin dort besorgt können domänenübergreifende Probleme auftreten, wenn sich die eingebettete Visualforce-Seite nicht in derselben Domäne wie das übergeordnete Fenster befindet.


als Basistest ich folgendes auf den eingebetteten Visualforce-Seite versucht, indem:

<script> 
    window.setTimeout(testRedirect,2000); 
    function testRedirect() { 
     top.location.reload(); 
    } 
</script> 

Dies führte in Chrome Protokollierung der Fehler:

Unsafe JavaScript attempt to access frame with URL https://na2.salesforce.com/006400000000000 from frame with URL https://ab2.na2.visual.force.com/servlet/servlet.Integration?lid=066400000000000&ic=1 . Domains, protocols and ports must match.

So sind die Domänen unterscheiden sich für die Visualforce-Seite.

+1

verwenden Ich suche dies als Teil der Lösung für meine [CSRF sicher Gewohnheit Taste, um Apex Methode verknüpft] (http://stackoverflow.com/questions/10809520/csrf-safe-custom-button-linked-to-apex-method/11006021#11006021) Frage. Es kann sein, dass ich einen Apex verwenden muss: actionFunction mit etwas Javascript, um 'window.top.location.href' nach Abschluss zu ändern. –

+0

Hallo Daniel, es sei denn, jemand einige super hinterhältige Taktik hat glaube ich Ihnen dabei kein Glück werden - das Problem ist, dass die eingebetteten Visualforce-Seiten werden von einer anderen Domäne bedient, und so sind Sie unterliegen den XSS-Schutz des Browsers . Hoffe, jemand beweist mich falsch und findet einen Weg, dies für Sie arbeiten zu lassen! –

Antwort

13

Es ist ein bisschen mehr Code, aber das funktioniert für mich in allen Browser, und ich bekomme keine Art von Cross-Domain-Fehler.

Controller Extension:

public class Opp_Ext { 
    private ApexPages.StandardController stdController; 
    public String redirectUrl {public get; private set;} 
    public Boolean shouldRedirect {public get; private set;} 

    public Opp_Ext(ApexPages.StandardController stdController) { 
     this.stdController = stdController; 
     shouldRedirect = false; 
    } 

    public PageReference doStuffAndRedirect() { 
     shouldRedirect = true; 
     redirectUrl = stdController.view().getUrl(); 
     return null; 
    } 
} 

VF Seite:

<apex:page standardController="Opportunity" extensions="Opp_Ext" > 
    <apex:form > 
     <apex:commandButton value="Do Stuff" action="{!doStuffAndRedirect}" rerender="redirectPanel" /> 
     <apex:outputPanel id="redirectPanel" > 
      <apex:outputText rendered="{!shouldRedirect}"> 
       <script type="text/javascript"> 
        window.top.location.href = '{!redirectUrl}'; 
       </script> 
      </apex:outputText> 
     </apex:outputPanel> 
    </apex:form> 
</apex:page> 
+0

Großartig, danke. Ich denke, der entscheidende Punkt ist, dass die Zuweisung zu window.top.location.href über Domains hinweg erlaubt ist. Dann muss nur noch das korrekte Javascript gerendert werden, nachdem die Schaltfläche gedrückt wurde.Ich habe etwas ähnliches, aber das ist besser, wenn das Javascript erst nach dem Drücken der Taste an den Client gesendet wird. –

+0

Ich bin wieder dazu gekommen und habe mir eine ähnliche Lösung einfallen lassen, wenn die URL zur Weiterleitung vorher bekannt ist. Siehe [SeiteReferenz von eingebetteter Visualforce-Seite wird inline] (http://salesforce.stackexchange.com/questions/11158/pagereference-from-embedded-visualforce-page-becomes) –

+0

genial! Danke :) –

0

versuchen, mithilfe PageReference Klasse

Zusätzlich setRedirect wird

Beispiel nützlich sein:

public class mySecondController { 
Account account; 

public Account getAccount() { 
    if(account == null) account = new Account(); 
    return account; 
} 

public PageReference save() { 
    // Add the account to the database. 

    insert account; 
    // Send the user to the detail page for the new account. 

    PageReference acctPage = new ApexPages.StandardController(account).view(); 
    acctPage.setRedirect(true); 
    return acctPage; 
} 

}

+2

Ich dachte, das ursprünglich, aber es lädt nur die Gelegenheit Seitenlayout in der Mini-Iframe, die VF-Seite eingebettet ist. – JCD

+0

das Ziel der command/command auf „_top“ und es wird die Seite im oberen Frame laden , dh das volle Fenster. –

0

Sie benötigen oncomplete = "window.top.location.href = '{!'/'+obj.id}';"

+0

Bitte erläutern Sie näher, wie und wo zu verwenden ist. Nur Code-Antworten sind verpönt, zum Beispiel kann jemand, der die Antworten liest, nicht schnell herausfinden, was genau dein Fix tut oder wie er verwendet wird. – clearlight

Verwandte Themen