合并字段不会显示在 visualforce 页面上

Merge fields won't show on visualforce page

我最近才开始学习 Apex,目前还有很多主题让我难以驾驭。我到处寻找有效的解决方案,但我仍然无法弄清楚。

我在我的 Salesforce 组织上创建了一个按钮,用于从 visualforce 页面呈现 PDF,并将其作为文件附加到记录。这将在稍后与 Docusign 一起使用以捕获合同签名。问题是,当在 VF 页面中使用合并字段时,它们要么根本不显示,要么我得到这个异常:“sObject 行是通过 SOQL 检索的,没有查询请求的字段”。

现在,异常明确指出我需要查询字段,这就是我发现我需要做的才能完成这项工作,但我一直无法弄清楚如何正确地做到这一点.我在我的控制器扩展中的几个地方尝试了 运行 查询但无济于事(我使用的是 SF 为我的自定义对象创建的标准控制器)。

这是我的分机代码:

public class attachPDFToQuote {
    
    public final i360__Quote__c q {get; set;} //Quote object
     
   
    
    //constructor
    public attachPDFToQuote (ApexPages.StandardController stdController) {
        q = (i360__Quote__c)stdController.getRecord(); 
        
        /* for(i360__Quote__c query:[SELECT Id, Correspondence_Name__c, Name FROM i360__Quote__c WHERE Id=: q.Id]){
      
      System.debug(i360__Quote__c.Correspondence_Name__c);
      }*/
        
    }
     
    
    public PageReference attachPDF() {
    
   /* for(i360__Quote__c query:[SELECT Id, Correspondence_Name__c, Name FROM i360__Quote__c WHERE Id=: q.Id]){
      
      System.debug(i360__Quote__c.Correspondence_Name__c);
      }*/
    
        //generate and attach the PDF document
        PageReference pdfPage = Page.ProjectAgreement;
        Blob pdfBlob; //create a blob for the PDF content
        if (!Test.isRunningTest()) { //if we are not in testing context
            pdfBlob = pdfPage.getContent(); //generate the pdf blob
        } else { //otherwise, we are in testing context. Create the blob manually.
            pdfBlob = Blob.valueOf('PDF');
        }
        
        
        ContentVersion cvAttach = new ContentVersion(ContentLocation= 'S');
        cvAttach.PathOnClient= 'Project Agreement.pdf';
        cvAttach.Title= 'Project Agreement';
        cvAttach.VersionData= pdfBlob;
        insert cvAttach;
        
        Id conDoc = [SELECT ContentDocumentID FROM ContentVersion WHERE Id=: cvAttach.Id].ContentDocumentId;
        ContentDocumentLink ConDocLink = new COntentDocumentLink();
        conDocLink.LinkedEntityId= q.Id;
        conDocLink.ContentDocumentId= conDoc;
        conDocLink.ShareType= 'V';
        insert conDocLink;
       
        
        //redirect the user
        PageReference pageWhereWeWantToGo = new ApexPages.StandardController(q).view(); //redirect the User back to the Quote detail page
        pageWhereWeWantToGo.setRedirect(true); //indicate that the redirect should be performed on the client side
        return pageWhereWeWantToGo; //send the User on their way
    }

}

我在尝试查询对象字段的地方保留了注释代码,以便它们在 VF 中显示。我也尝试了几种不同的方法,但似乎没有任何效果。如果我需要添加任何其他内容,请告诉我。

谢谢!

您没有 post Visualforce 页面的代码。

即使是同一页面(如果您的顶点 class 在 ProjectAgreement VF 中用作 <apex:page standardController="i360__Quote__c" extensions="attachPDFToQuote" - 抓取页面的 PDF 版本的行为算作标注,单独的 http 流量到页面的新实例可以这么说。

所以我怀疑你需要像

这样的东西
PageReference pdfPage = Page.ProjectAgreement;
pdfPage.getParameters().put('id', q.Id);
Blob = pdfPage.getContent();

如果可行...下一步将查看您的 VF 代码。

如果页面有 {!i360__Quote__c.Name}, {!i360__Quote__c.Correspondence_Name__c} 这样的合并字段,那么奇迹就会发生。 Salesforce 应该通过查看您的 VF 页面来确定需要哪些字段,并默默地为您查询。因此,您甚至不需要在构造函数中进行查询,只需将 stdController.getId() 保存到 class 变量,然后在 pdfPage.getParameters().set(...)

中使用该 id

但是,如果您的 VF 页面引用了 {!quote.Correspondence_Name__c},那么您需要在其中保留显式查询。