2012-07-19 10 views
12

Mam stronę Visualforce, która jest osadzona na stronie szczegółów Opcji.Strona Visualforce osadzona na stronie szczegółów, która musi przekierować na inną stronę

Na stronie znajduje się przycisk polecenia wywołujący metodę w rozszerzeniu kontrolera wewnętrznego.

Po zakończeniu metody tworzenia kopii zapasowych, w jaki sposób mogę przekierować użytkownika na inną stronę?

mogę zwrócić PageReference od metody, ale będzie przekierowywać tylko iframe że osadzony strona Visualforce jest wyświetlany w.

Idealnie chciałabym, aby odświeżyć okno najwyższego poziomu, ale nie jestem zainteresowany mogą występować problemy z wieloma domenami, jeśli osadzona strona visualforce nie znajduje się w tej samej domenie, co okno nadrzędne.


jako podstawowy test Próbowałem dodanie następujących do wbudowanego stronie Visualforce:

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

Spowodowało Chrome zalogowaniu błąd:

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.

Więc domeny różnią się dla strona Visualforce.

+1

szukam używać tego jako część rozwiązania dla mojego [CSRF bezpiecznego Niestandardowy przycisk powiązany z metodą Apex] (http://stackoverflow.com/questions/10809520/csrf-safe-custom-button-linked-to-apex-method/11006021#11006021) pytanie. Może być konieczne użycie apex: actionFunction z niektórymi javascriptami, aby zmienić 'window.top.location.href' po zakończeniu. –

+0

Cześć Daniel, chyba że ktoś ma jakąś super podstępną taktykę, myślę, że będziesz miał pecha z tym - problem polega na tym, że osadzone strony visualforce są podawane z innej domeny, więc podlegasz ochronie XSS przeglądarki . Mam nadzieję, że ktoś mi udowodni, że się mylę i znajdzie sposób, żeby to zadziałało! –

Odpowiedz

13

To trochę więcej kodu, ale to działa na mnie w ogóle przeglądarki i nie otrzymuję żadnego rodzaju błędu międzydomenowego.

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 strony:

<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

Świetnie, dzięki. Sądzę, że kluczowe jest to, że przypisywanie do window.top.location.href jest dozwolone w różnych domenach. To tylko kwestia renderowania poprawnego kodu Javascript po naciśnięciu przycisku.Skończyłem z czymś podobnym do tego, ale twoje jest lepsze z tym, że javascript jest wysyłany do klienta po naciśnięciu przycisku. –

+0

Wróciłem do tego i wymyśliłem podobne rozwiązanie, jeśli adres URL do przekierowania jest znany wcześniej. Zobacz stronę [PageReference z osadzonej strony Visualforce zostanie wstawiona] (http://salesforce.stackexchange.com/questions/11158/pagereference-from-embedded-visualforce-page-becomes) –

+0

niesamowite! dzięki :) –

0

Spróbuj za pomocą PageReference Class

oprócz setRedirect będzie przydatna

Próbka:

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

Myślałem o tym pierwotnie, ale po prostu ładuje układ strony Możliwości w mini ramce iframe, w której osadzona jest strona VF. – JCD

+0

Ustawia cel polecenia commandLink/commandButton na "_top" i załaduje stronę w górnej ramce , czyli pełne okno. –

0

Trzeba użyć oncomplete = "window.top.location.href = '{!'/'+obj.id}';"

+0

Proszę podać więcej objaśnień, jak i gdzie używać. Odpowiedzi tylko na kod są pomarszczone, na przykład ktoś czytający odpowiedzi nie może szybko zorientować się, co dokładnie robi twoja poprawka i jak z niej korzystać. – clearlight

Powiązane problemy