Страница не перерисовывается после добавления кода выбора списка - PullRequest
1 голос
/ 27 мая 2019

Я новичок в Salesforce, в настоящее время изучаю элементы visualforce.

У меня возникла проблема в моем коде: когда я вставляю код SelectList в свою страницу visualForce, перерисовка страницы перестает работать.

Без повторного рендеринга страницы 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 голосов
/ 01 июня 2019

Ваши привязки значений на этих компонентах установлены неправильно.

<apex:selectList value="{!Contact}" multiselect="true" id="slist1" style="overflow scroll; height : 100px;">

<apex:selectList> необходимо привязать к String или List<String> (только для multiselect=true),Здесь вы связали его с переменной sObject.

Тот факт, что вы назвали свою переменную sObject так же, как и ее класс Contact, с большой вероятностью может вызвать дальнейшие проблемы.Apex не чувствителен к регистру, поэтому contact и Contact имеют одинаковый идентификатор.В общем случае не следует повторно использовать зарезервированные слова или имена системных классов в качестве имен переменных, что вы снова делаете с id.

<apex:selectOptions value="{!ContactFields}"></apex:selectOptions>

<apex:selectOptions>, его value должен быть связан с List<SelectOptions>.Вы объявили свойство с таким именем неправильного типа:

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

, а также реализовали метод получения с правильным типом:

public List<SelectOption> getContactFields(){

Опять же, это может привести кне интуитивное поведение, даже если оно компилируется и рендерится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...