salesforce从sObject转换为自定义对象

时间:2011-06-03 05:44:57

标签: salesforce apex-code visualforce

我编写了一个基本控制器,我想用它来管理服务器控制器上的数据分页。

我有一个像这样的抽象方法

 public abstract List<sObject> getPagedData();

然后,我的每个扩展基本控制器的控制器都实现了自己的getPagedData版本。但是返回特定的客户对象,例如Foo__c

我可以在visualforce页面中从List<sObject>投射到List<Foo__c>

我的页面看起来像这样

  <apex:dataTable value="{!PagedData}"  var="c"   >
     <apex:column > 
          <apex:facet name="header">Foo</apex:facet>
          <apex:outputText value="{!c.Bar__r.SomeValue__c]}" />
  </apex:column>   

但是我得到一个错误,sObject不知道Bar__r我试过使用dataTable值和在outputText中做一个Cast,但它似乎不起作用

我可以使用动态绑定http://www.salesforce.com/us/developer/docs/pages/Content/pages_dynamic_vf.htm但是我如何做

之类的事情
<apex:outputText value="{0, number, $###,###}">
         <apex:param value="{!c.Amount__c}" />
</apex:outputText>
<apex:outputText value="{0,date,dd/MM/yyyy}">
          <apex:param value="{!c.Date_Of_Birth__c}" />
</apex:outputText>   

因为我得到错误说它需要DateTime对象等

1 个答案:

答案 0 :(得分:4)

去过那儿。不幸的是,没有办法直接在visualforce页面中投射对象。

我解决这个问题的方法是将所有分页逻辑以通用形式移动到您的基本控制器中,然后让子控制器负责将数据转换为您的visualforce页面所期望的形式。

public List<Foo__c> getFooPagedData() {
    List<Foo__c> fooPagedData = new List<Foo__c>();
    for(SObject record : getPagedData()) {
       fooPagedData.add((Foo__c) record));
    }
    return fooPageData;
}

您也可以考虑使用StandardSetController来控制您的分页。它适用于自定义对象和大多数标准对象,但不适用于自定义ApexClasses和某些标准对象。那表示你仍然需要将结果集转换为从其getRecords()方法返回List。