[SalesForce] PageReference from embedded Visualforce page becomes inlined

I have a Visualforce page that gets embedded into the opportunity page layout. Part of the embedded page is a command button with an action defined in the controller to redirect the user to another page.

Snippet from controller method referenced by the command button:

public PageReference editDynamicProperties() {
    PageReference editpr = Page.AnotherPage;

    Map<string, string> params = editpr.getParameters();
    params.put('oppId', opportunityFromController.Id);
    // Attempt to remove the &inline query string parameter, but it isn't present yet.
    if(params.containsKey('inline')) {
        params.remove('inline');
    }
    editpr.setRedirect(true);
    System.debug(LoggingLevel.Info,'editDynamicProperties() redirecting to ' + editpr);
    return editpr;
}

When the button is pressed the redirection occurs, but the query string picks up the parameter &inline=1. As a result the page is rendered without any of the standard Salesforce content, such as the AppBodyHeader or sidebar. Manually removing the &inline=1 produces the desired results.

I tried explicitly removing the inline parameter from the PageReference, but it isn't present at that time. I've also tried explicitly adding &inline=0, the headers still get removed. It doesn't seem to matter what the value of inline is, only that it is present.

How can I redirect from an embedded Visualforce page to another page without becoming inlined?

Best Answer

I managed to hack my way around it by using JavaScript in the command button oncomplete to do the redirection from the top level window.

Simplified Page:

My reality is a bit more complicated as the Command button is a dynamic Visualforce component.

E.g. public PageReference stubAction() { return null; }

public PageReference editDynamicProperties() {
    PageReference editpr = Page.AnotherPage;

    Map<string, string> params = editpr.getParameters();
    params.put('oppId', opportunityFromController.Id);

    editpr.setRedirect(true);
    return editpr;
}

public Component.Apex.OutputPanel getDynamicPropertyControls() {
    //...

    Component.Apex.PageBlockButtons pbButtons = new Component.Apex.PageBlockButtons();
    pb.childComponents.add(pbButtons);

    Component.Apex.CommandButton editCommandButton = new Component.Apex.CommandButton();
    editCommandButton.value='Edit';
    //editCommandButton.expressions.action = '{!editDynamicProperties}';
    editCommandButton.expressions.action = '{!stubAction}';

    editCommandButton.rerender= new Set<string>{'dynamicForm'};
    editCommandButton.oncomplete= 'window.top.location.href = \''+editDynamicProperties().getUrl()+'\'';
    pbButtons.childComponents.add(editCommandButton);

    //...
}

UPDATE: Apparently I've come across this problem before. See Visualforce Page embedded in a detail page that needs to redirect to other page That question had a very similar answer by JCD, but the redirection was handled by the rerendered component.

Related Topic