添加选择列表代码后页面未重新呈现

时间:2019-05-27 06:46:12

标签: salesforce visualforce

我是新手,在salesforce中,目前正在学习Visualforce元素。

我的代码存在问题,当我在visualForce页面中插入SelectList代码时,页面重新呈现将停止工作。

没有SelectList页面重新呈现效果很好。

我在下面提供了代码段。从控制器未添加的SelectList保存方法后,也未调用联系人,但我尝试插入的联系人未插入。

感谢您的帮助。

这是我的visualforce页面。

<apex:page controller="ContactController">
    <apex:form >
        <apex:pageBlock> 
            <apex:pageBlockSection >
                <apex:inputField value="{!Contact.AccountId}" label="Account Name:"/>
                <apex:inputField value="{!Contact.LastName}" label="LastName"/>
                <apex:inputField value="{!Contact.phone}" label="Phone"/>
                <apex:inputField value="{!Contact.Department}"/>            
                <apex:inputField value="{!Contact.Designation__c}"/>
            </apex:pageBlockSection>
            <apex:pageBlockSection id="id3">
                 <apex:pageBlockSectionItem >
                <apex:actionRegion >
                <apex:selectList value="{!Contact}" multiselect="true" id="slist1" style="overflow scroll; height : 100px;">
                    <apex:actionSupport event="onchange" rerender="id1" />
                    <apex:selectOptions value="{!ContactFields}"></apex:selectOptions>
                </apex:selectList><p/>
                </apex:actionRegion>
                </apex:pageBlockSectionItem>
            </apex:pageBlockSection>

            <apex:pageBlockSection id="id1">
                <apex:pageBlockTable value="{!contactList}" var="c"  >
                    <apex:column headerValue="Last Name">
                        <apex:outputField value="{!c.Lastname}"/>
                    </apex:column> 
                    <!--   <apex:column headerValue="Account">
<apex:outputField value="{!c.Account.Name}"/>
</apex:column> -->
                </apex:pageBlockTable> 
            </apex:pageBlockSection> 
            <apex:pageBlockButtons >
                <apex:commandButton value="Save" action="{!save}" reRender="id1"/>
            </apex:pageBlockButtons>
        </apex:pageBlock>
    </apex:form>

</apex:page>

这是我的控制器。

public class ContactController {
    public Account account { get; private set; }
    public Contact contact { get; set; }

    public List<Contact> contactList{get {return ([SELECT LastName,Account.Name FROM Contact where Account.Id = :ApexPages.currentPage().getParameters().get('id') order by createdDate DESC limit 5]);} set;}

    public Id id;
    Map<String, Schema.SobjectField> Contactfields{ get; set;}
    List<SelectOption> lstContactFields{get;set;}

    public ContactController() {
        contact=new Contact();
        id = ApexPages.currentPage().getParameters().get('id');
        contact.AccountId=id;
        Contactfields = Schema.SobjectType.Contact.fields.getMap();
    }


    public List<SelectOption> getContactFields(){
        if(lstContactFields==null){
            lstContactFields=new List<SelectOption>();
        }
        for(Schema.SObjectField s:Contactfields.values()){
            Schema.DescribeFieldResult fieldResult = s.getDescribe();
            lstContactFields.add(new SelectOption(String.valueof(fieldResult.getName()),String.valueof(fieldResult.getLabel())));
            //  lstContactFields.add(Contactfields.get(s).getDescribe().getLabel());
            //lstContactFields.add(String.valueOf(s));
        }

        return lstContactFields;
    }

    public PageReference save() {
        try {
            System.debug('save method');            
            upsert contact;
            contact.Id=null;
            return null;
        } catch(System.DMLException e) {
            ApexPages.addMessages(e);
            return null;
        }
        //  After successful Save, navigate to the default view page
        //  PageReference pg = new PageReference(System.currentPageReference().getURL());
        //  pg.setRedirect(true);
        //    return pg; 

    }

}

1 个答案:

答案 0 :(得分:0)

您在这些组件上的值绑定设置不正确。

function lightStars () {
   var starNumber = e.target.alt;
   var stars = document.querySelectorAll("span#stars img");
   stars.forEach((function(x){ x.setAttribute("src", "bw_star2.png");}))

} 

<apex:selectList value="{!Contact}" multiselect="true" id="slist1" style="overflow scroll; height : 100px;"> 需要绑定到<apex:selectList>String(仅用于List<String>)。在这里,您已将其绑定到sObject变量。

您已将sObject变量与其类multiselect=true命名相同,这很可能导致进一步的问题。 Apex区分大小写,因此Contactcontact是相同的标识符。通常,您不应将保留字或系统类名称重用作为变量名,而要使用Contact再次这样做。

id

<apex:selectOptions value="{!ContactFields}"></apex:selectOptions> 必须将其<apex:selectOptions>绑定到value。您用该名称声明的属性类型有误:

List<SelectOptions>

同时实现正确类型的getter方法:

Map<String, Schema.SobjectField> Contactfields{ get; set;}

同样,即使它确实进行编译和渲染,这也可能会产生不直观的行为。