Salesforce 如何打开一个VF页面作为弹出窗口,并将参数传递给该VF页面?

Salesforce 如何打开一个VF页面作为弹出窗口,并将参数传递给该VF页面?,salesforce,apex-code,visualforce,Salesforce,Apex Code,Visualforce,我有一个VF页面,有两个日期字段和搜索按钮 点击搜索我得到一些结果。我还有另一个按钮来打印这些结果,它只是一个新的VF页面,呈现为pdf格式 我想将此日期值传递到printVF页面。我还想让这个页面弹出 我有参数设置的pageref。因为我需要打开这个页面作为弹出窗口,我需要找到一种方法来使用window.open中的pageref 有人对如何做到这一点有想法吗 谢谢 胡说八道 编辑:我所做的是在控制器中构建url,并在window.open中使用控制器变量。一些非常奇怪的事情正在发生。。。第一

我有一个VF页面,有两个日期字段和搜索按钮

点击搜索我得到一些结果。我还有另一个按钮来打印这些结果,它只是一个新的VF页面,呈现为pdf格式

我想将此日期值传递到printVF页面。我还想让这个页面弹出

我有参数设置的pageref。因为我需要打开这个页面作为弹出窗口,我需要找到一种方法来使用window.open中的pageref

有人对如何做到这一点有想法吗

谢谢

胡说八道

编辑:我所做的是在控制器中构建url,并在window.open中使用控制器变量。一些非常奇怪的事情正在发生。。。第一次显示搜索结果时,我单击“打印”按钮,字符串中不会填充日期,它们默认为今天的日期。。如果我再次单击“打印”按钮,则从dateinput在url上正确填充日期

      public Class1(){
      System.debug('inside constructor');
       fieldContainer=new DummyTable__c(); // it contains date fields for date inputs
      date todays=date.today();

     If (fieldContainer.Start_Date__c== null)
     {
        startdate1=todays;
     }else
     {
     startdate1=fieldContainer.Start_Date__c;
     }

     If (fieldContainer.End_Date__c== null)
     {
        enddate1=todays;
     }
     else
     {
     enddate1=fieldContainer.End_Date__c;
     }
     }

     public void search()
{

    startdate1=fieldContainer.Start_Date__c;
    system.debug('startdate1'+startdate1);


    enddate1=fieldContainer.End_Date__c;
    system.debug('enddate1'+enddate1);
    system.debug('inside search()....after clicking search button');
    system.debug('startdate1'+startdate1);
    system.debug('url'+url);
    LoadData();
}

    public string geturl()
{
    url='apex/VF1?Pstartdate='+string.valueof(startdate1)+'&Penddate='+string.valueof(enddate1);
    return url;
}

public string geturlRec()
{
    urlRec='apex/VF2?Pstartdate='+string.valueof(startdate1)+'&Penddate='+string.valueof(enddate1);
    return urlRec;
}    
VF页面

   <script  language="javascript" type="text/javascript">
  function printOut()
  {

  window.open("{!url}");

      }
  function printIn()
  {
  window.showModalDialog("{!urlRec}","dialogWidth:800px; dialogHeight:200px; center:yes");

   }
   </script>


    <div style="width:900px;margin:0 auto;" id="pagediv">
     <span style="padding-left:30px;padding-right:10px">From </span><apex:inputfield value="{!fieldContainer.Start_Date__c}" id="startdt" style="padding-left:5px;padding-right:20px;"/>
   <span style="padding-left:30px;padding-right:10px">To </span><apex:inputfield value="{!fieldContainer.End_Date__c}" id="enddt" style="padding-left:5px;padding-right:20px;"/>

     <span style="padding-left:30px;padding-right:10px"><apex:commandButton action="{!search}" value="Search" ReRender="dtshipdep,dtshiprec,shippageblock">       </apex:commandButton></span>

函数打印输出()
{
window.open(“{!url}”);
}
函数printIn()
{
showmodaldiallog(“{!urlRec}”,“对话框宽度:800px;对话框高度:200px;中心:yes”);
}
从…起
到


您应该能够在查询字符串中传递所需的值

window.open("/apex/YourPage?VariableName=Value&SecondVariableName=SecondValue");
然后,一旦将变量发送到新页面,就可以使用


salesforce建议通过URLFOR()函数生成URL。或者,您也可以在扩展/控制器代码中创建页面引用

但是,请记住,在任何表单数据成为URL的一部分之前,必须将其发布到服务器并以新生成的pageReference返回,因此,您不能在第一次运行时点击它

我用来解决这个服务器端问题的一种方法是在VF上使用这个代码

<apex:outputBlock rendered="{!openPopup}">
   <script>
      window.open('{!myTargetUrl}');
   <script>
</apex:outputBlock>

open('{!myTargetUrl}');
openPopup
是一个bool,用于控制是否渲染此段(暂时,单击“打开”按钮时将其设置为true)
myTarget
是一个基于
PageReference
的URL(或者,您可以使用URLFORHERE在VF中生成URL)。如果你还有任何问题,请提问


另一个选择是将javascript代码放在VF中,它将拾取按钮单击事件并构建URL客户端并打开它。您可以使用$Component查找表单字段

在将参数用作动态查询的一部分之前,请确保对参数调用
String.escapeSingleQuotes
!谢谢你,马修。。。我所做的是在控制器中构建url,并在wondow.open中使用控制器变量。一些非常奇怪的事情正在发生。。。第一次显示搜索结果时,我单击按钮,字符串中不会填充日期。。如果我再次单击“打印”按钮,则在urlCheck out mmix的答案上正确填充日期,以帮助解决该问题。他的解决方案可能对你很有效。另一个选项是使用来组合URL,而不是使用Visualforce bindings.mmmix调用Apex方法,在我的示例中,表单字段在用户单击搜索按钮时发送到服务器。我正在尝试只打印搜索结果。因此,当搜索完成时,表单字段值被正确设置。但是问题似乎是printbuttons第一次出现在您的printout按钮上,它有一个JS处理程序,调用在上一次服务器调用中生成的Url。然后页面调用服务,刷新(包括url),以便第二次单击可以正常工作。你需要清楚事件的顺序
String myVariable = PageReference.getParameters().get('VariableName');
<apex:outputBlock rendered="{!openPopup}">
   <script>
      window.open('{!myTargetUrl}');
   <script>
</apex:outputBlock>