Salesforce/Apex-保存动态复选框数的值

Salesforce/Apex-保存动态复选框数的值,salesforce,apex-code,visualforce,Salesforce,Apex Code,Visualforce,我目前在联系人记录中嵌入了一个Visualforce页面,该页面显示所有活动,并带有一个复选框,指示联系人是否为活动的成员(如果选中,则联系人为成员)。我还有一个保存更改的命令按钮。visualforce代码是使用apex:repeat生成的,如下所示: <apex:repeat value="{!campaignWrappers}" var="cm"> <div class="MailingRow"> <apex:outputText styleCl

我目前在联系人记录中嵌入了一个Visualforce页面,该页面显示所有活动,并带有一个复选框,指示联系人是否为活动的成员(如果选中,则联系人为成员)。我还有一个保存更改的命令按钮。visualforce代码是使用apex:repeat生成的,如下所示:

<apex:repeat value="{!campaignWrappers}" var="cm"> <div class="MailingRow"> <apex:outputText styleClass="CampaignLabel" value="{!cm.c.Name}" ></apex:outputText> <apex:inputCheckbox styleClass="CampaignCheck" value="{!cm.selected}" /> </div> </apex:repeat> 我的问题是,将复选框值传递给控制器的最佳方式是什么?理想情况下,我希望只传递已更改的复选框,传递从选中到未选中的复选框列表,以及包含从未选中到已选中复选框的第二个列表。然后我可以插入和删除这些列表

在这种情况下,是否应该在复选框上使用actionSupport标记

<apex:actionSupport event="onChange" action="{!updateChangeList}" />
整个集合将被发送回服务器(因此所有复选框的状态)。Salesforce和任何其他与web相关的语言之间没有太大区别(例如,请参阅。主要区别在于,通常使用名称以
[]
结尾的变量,SF将使用名称中某处数字递增的唯一名称)

如果你真的想建立2个列表-也许是添加/删除2个隐藏文本字段内容的javascript魔法。。。但这有点乱

当表单将被提交并且调用您的
updateChangeList()
时,您可以迭代活动包装器的集合,并与以前的值进行比较。将前一个值存储在包装器中的另一个变量中&不要将其公开给用户,否则根据活动中的内容您仍然可以知道:

Set<Id> campaignsToBeAddedTo = new Set<Id>();
Set<Id> campaignsToBeRemovedFrom = new Set<Id>();

for(CampaignMember cm : campaignWrappers){
   if(cm.selected && cm.c.CampaignMembers.isEmpty(){
      // is ticket but wasn't a member before
      campaignsToBeAddedTo.add(cm.c.Id);
   } else if (!cm.selected && !cm.c.CampaignMembers.isEmpty()){
      // not ticked but used to be a member
      campaignsToBeRemovedFrom.add(cm.c.Id);
   }
}
Set-activitystobeadedto=new-Set();
Set-activitystoberemovedfrom=new-Set();
for(活动成员cm:ActivationWrappers){
if(cm.selected&&cm.c.CampaignMembers.isEmpty(){
//是票,但以前不是会员
添加的活动(cm.c.Id);
}如果(!cm.selected&!cm.c.campetingmembers.isEmpty()),则为else{
//未勾选但曾是会员
从添加中删除的活动(cm.c.Id);
}
}
您甚至可以对其进行一些优化(比如将isEmpty()检查放在helper变量中)。或者阅读有关可能产生“副作用”的setter方法的内容。毕竟,当表单数据被反序列化时,您将运行这样的循环。这是一个很好的起点(我知道这很古老。基本上在这篇博文之前,我们必须为我们想在VF中使用的每个变量编写
Boolean getSelected()
void setSelected(Boolan b)


最后但并非最不重要的一点-指向的链接。

您可以使用联系人对象的包装类来存储联系人的当前和新状态,以检查联系人是否是活动的成员

public class ContactWrapper 
{                 
 public Boolean checked{ get; set; }            
 public Contact con { get; set;}                     

 public AccountSKUWrapper()
 {                
   con = new Contact();                
   checked = false;            
 }                     

 public ContactWrapper(Contact c)
 {                
   con= c;                
   checked = c.selected;            
 }                               
}

使用选中的字段,我们可以识别contact是否是活动的成员,并且包装中的选中的变量有助于识别VF页面中给出的输入。创建ContactWrapper列表,并使用重载构造函数“ContactWrapper(contact c)”初始化每个ContactWrapper对象

最后使用这两个列表更改的ContactList未更改的ContactList。您可以插入或删除dml

我相信这里没有使用ActionSupport标记,因为所有需要的值都将使用ContactWrapper列表的getter和setter来使用(读/写)

public List<ContactWrapper> wrapper {get;set;}
公共列表包装器{get;set;}

感谢您提供的信息眼霜。我有点困惑。因此,在每个复选框上使用actionSupport并不是前进的方向,相反,我会在commandbutton上设置一个操作,该操作按照上面的示例执行逻辑。我是否需要为每个复选框设置一个ID,以便在控制器中识别它们?我无法在visual Button中设置ID强制:id={!cm.c.id},因为它必须是文字?ActionSupport不是魔杖;)这是一个AJAX快捷方式,可以提交整个表单并执行操作。当用户选中复选框时,将其视为立即单击某个隐藏按钮。关键是这将是一个网络流量。如果您想逐个发送它们,当然可以。您可以,但不必设置id。它们将获得
id
name
set autom不必担心,假设在输入方法体时,所有变量都将被解析等等。对于您来说,准备好使用了谢谢您的详细解释!
Create 2 list **CHANGEDCONTACTLIST** and **UNCHANGEDCONTACTLIST** and then Loop through the list of ContactWrapper

begin loop
1.If checked differs then load **CHANGEDCONTACTLIST** with Contact Wrapper object as this need to be updated in Contact object; in order to update selected field of contact. 

2.Else load **UNCHANGEDCONTACTLIST**.
end loop
public List<ContactWrapper> wrapper {get;set;}