visualforce中inputCheckbox的奇怪行为(bug)

时间:2013-06-08 13:42:32

标签: visualforce

inputCheckbox和commandLink / commandButton不能一起工作!!

案例1:

尝试代码。

这个中的visualforce动作无效。

    <apex:commandLink action="{!SelectTicket}" reRender="outputPanel">
         <apex:inputCheckbox value="{!ordsOptions[o]}"/>
        <apex:param name="selected" value="{!o.id}" assignTo="{!selected}"/>
    </apex:commandLink>

在inputCheckbox中没有

value="{!ordsOptions[o]}"
。几乎相同的代码工作正常。

    <apex:commandLink action="{!SelectTicket}" reRender="outputPanel">
         <apex:inputCheckbox/>
        <apex:param name="selected" value="{!o.id}" assignTo="{!selected}"/>
    </apex:commandLink>

案例2:

在另一列中添加inputCheckbox时,它根本不会触发操作。

    <apex:dataTable border="4" value="{!ords}" var="o">
        <apex:column >
            <apex:commandLink action="{!SelectTicket}" reRender="outputPanel">
                <apex:inputCheckbox />
                <apex:param name="selected" value="{!o.id}" assignTo="{!selected}"/>
            </apex:commandLink>
        </apex:column>
        <apex:column ><apex:inputCheckbox value="{!ordsOptions[o]}"/></apex:column>
        <apex:column ><apex:outputText value="{!ordsOptions[o]}"/></apex:column>
        <apex:column value="{!o.Id}"/>
        <apex:column value="{!o.Name}"/>
    </apex:dataTable>

如果没有inputCheckbox和commandLink,它就可以正常工作:

    <apex:dataTable border="4" value="{!ords}" var="o">
        <apex:column >
            <apex:commandLink action="{!SelectTicket}" reRender="outputPanel">
                <apex:inputCheckbox />
                <apex:param name="selected" value="{!o.id}" assignTo="{!selected}"/>
            </apex:commandLink>
        </apex:column>
        &lt;-- <apex:column ><apex:inputCheckbox value="{!ordsOptions[o]}"/></apex:column> --&gt;
        <apex:column ><apex:outputText value="{!ordsOptions[o]}"/></apex:column>
        <apex:column value="{!o.Id}"/>
        <apex:column value="{!o.Name}"/>
    </apex:dataTable>

整个代码

VF:

<apex:page controller="SelectRadio" sidebar="false">
    <apex:outputPanel id="outputPanel">
    <apex:form >
        <apex:dataTable border="4" value="{!ords}" var="o">
            <apex:column >
                <apex:commandLink action="{!SelectTicket}" reRender="outputPanel">
                    <apex:inputCheckbox />
                    <apex:param name="selected" value="{!o.id}" assignTo="{!selected}"/>
                </apex:commandLink>
            </apex:column>
            <apex:column ><apex:inputCheckbox value="{!ordsOptions[o]}"/></apex:column>
            <apex:column ><apex:outputText value="{!ordsOptions[o]}"/></apex:column>
            <apex:column value="{!o.Id}"/>
            <apex:column value="{!o.Name}"/>
        </apex:dataTable>
        <apex:commandButton action="{!rSfdc}" value="按鍵"/>
    </apex:form>
    <hr/>
    <h1>Debug</h1>
        <p>ordsOptions = {!ordsOptions}</p>
        <p>ordsOptionName = {!ordsOptionName}</p>
        <p>selected = {!selected}</p>
    </apex:outputPanel>
</apex:page>

类:

public with sharing class SelectRadio {

    public List<String> vars {get;set;}
    public List<Custom_Object__c> ords {get; set;}
    public Map<Id,Boolean> ordsOptions {get; set;}
    public Map<Id,String> ordsOptionName {get; set;}
    public Id selected {get;set;}

    public SelectRadio(){
        ordsOptions = new Map<Id,Boolean>();
        ordsOptionName = new Map<Id,String>();
        ords = [ SELECT Id, Name FROM Custom_Object__c ORDER BY Name ];
        for (Custom_Object__c tmp : ords) {
            ordsOptions.put(tmp.Id, false);
            ordsOptionName.put(tmp.Id, tmp.Name);
        }
    }

    public pageReference SelectTicket() {
        for(Custom_Object__c tmp : ords) if(tmp.Id == selected) ordsOptions.put(tmp.Id, true); else ordsOptions.put(tmp.Id, false);
        return null;
    }

    public PageReference rSfdc() {
        PageReference rp = new PageReference('http://www.salesforce.com');
        rp.setRedirect(true);
        return rp;
    }
}

1 个答案:

答案 0 :(得分:0)

这根本不是一个错误。而且,必须如此。

这完全是关于OO编程的逻辑。

最后,我找到了答案。

在此处查看答案:http://boards.developerforce.com/t5/Visualforce-Development/Strange-Bug-of-the-apex-inputCheckbox/m-p/631629/highlight/false#M65163

它可以用来替换selectRadio,模式代码比apex:selectRadio更灵活。样本模式很容易与apex一起使用:dataTable和apex:repeat。这就是编写代码的原因。如果你愿意,可以随身携带。