2011-06-03 89 views
2

我写了一个基本控制器,我想用它来管理服务器控制器上的数据分页。salesforce从sObject转换为自定义对象

我有像这样

public abstract List<sObject> getPagedData(); 

我的控制器,扩展主控制器实现自己的getPagedData的版本然后每一个抽象方法。但返回一个特定的客户对象如Foo__c

我可以从List<sObject>在visualforce页投射到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我已经尝试做与数据表值,并在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对象等

回答

3

去过那里。不幸的是,没有办法直接在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。

+0

谢谢我已经在使用StandardSetController并执行如您所示的方法。它似乎有点像我的黑客肮脏,并认为会有更干净的方式来做到这一点 – Daveo 2011-06-04 02:45:08

+0

我与你同在。我希望StandardSetController被参数化,以便它的getRecord()返回正确的类型。唉,这不是选择的模式。 – 2011-06-06 01:22:28

+0

我同意拉尔夫,没有办法根据具体的类型在VF中播放数据。 – 2011-06-06 09:21:08