Подтвердить что ты не робот

Страница Visualforce, встроенная в подробную страницу, которая должна перенаправляться на другую страницу

У меня есть страница Visualforce, которая встроена на страницу подробных сведений о возможностях.

Внутри страницы находится командная кнопка, вызывающая метод в расширении контроллера.

Как только метод поддержки будет завершен, как я могу перенаправить пользователя на другую страницу?

Я могу вернуть PageReference из метода, но он будет перенаправлять только iframe, на который будет отображаться страница встроенного Visualforce.

В идеале я хотел бы обновить окно верхнего уровня, но я обеспокоен тем, что могут возникнуть проблемы с перекрестными доменами, если встроенная страница visualforce не находится в том же домене, что и родительское окно.


В качестве базового теста я попытался добавить на встроенную страницу Visualforce следующее:

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

В результате Chrome запустил ошибку:

Небезопасная попытка JavaScript для доступа к фрейму с URL-адресом https://na2.salesforce.com/006400000000000 из фрейма с URL-адресом https://ab2.na2.visual.force.com/servlet/servlet.Integration?lid=066400000000000&ic=1. Домены, протоколы и порты должны соответствовать.

Таким образом, домены различаются для страницы Visualforce.

4b9b3361

Ответ 1

Это немного больше кода, но это работает для меня во всех браузерах, и я не получаю никакой междоменной ошибки.

Расширение контроллера:

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 Страница:

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

Ответ 2

Попробуйте использовать PageReference Класс

Кроме того, setRedirect будет полезен

Пример:

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

}

Ответ 3

Вам нужно использовать oncomplete = "window.top.location.href = '{!'/'+obj.id}';"