Salesforce (Visualforce): повторное рендеринг - получение значений со страницы, а не запись? - PullRequest
1 голос
/ 23 января 2012

Я застрял в своем представленном здесь аргументе - я довольно уверен, что извлекаю значения из самой записи, а не из страницы visualforce.Когда я изменяю значение (are_you_kp__c) с записи на «Нет» - секция страницы блокируется, но по какой-то причине это не так.Кто-нибудь знает почему?

Я думаю, что мне нужно немного работы контроллера здесь - но не уверен, куда идти отсюда ...

<apex:pageBlock title="New Bid" mode="maindetail" tabStyle="Proposal__c">
    <apex:messages/>
    <apex:actionRegion>
    <apex:pageBlockSection columns="2" title="Bid Information" collapsible="false" showHeader="true">
        <apex:inputField value="{!rfp.Bid_Amount__c}"/>
        <apex:outputField value="{!rfp.Bid_Date__c}"/>
        <apex:inputField value="{!rfp.Bid_Deliver_By__c}"/>
        <apex:inputField value="{!rfp.Bid_Comments__c}"/>
        <apex:pageBlockSectionItem>
               <apex:outputLabel value="Are you the Key Appraiser?"/>
               <apex:outputPanel>             
                   <apex:inputField value="{!rfp.are_you_kp__c}" required="true">
                       <apex:actionSupport status="StatusChange" event="onchange" rerender="PageErrors, appraiserInfo"/>
                       <apex:actionStatus startText="Updating page ..." id="StatusChange"/>
                   </apex:inputField>  
               </apex:outputPanel>
        </apex:pageBlockSectionItem> 
    </apex:pageBlockSection>
    </apex:actionRegion>
    <apex:pageBlockSection title="Testing" columns="2" rendered="{!rfp.are_you_kp__c == 'No'}" id="appraiserInfo">
        <apex:pageBlockSectionItem>
            <apex:outputLabel value="Single Point of Contact" for="spoc"/>
                <apex:selectList id="spoc" value="{!rfp.SPOCL__c}" size="1" title="Single Point of Contact Select">
                    <apex:selectOptions value="{!SPOCS}"></apex:selectOptions>
                </apex:selectList>
        </apex:pageBlockSectionItem>
    </apex:pageBlockSection>
</apex:pageBlock>

Обновлен - обернут элемент рендеринга в outputPanelс правильным идентификатором: все еще есть проблема переключения моего обработанного логического значения в результате изменения на inputField - как бы я переключил это в контроллере?Я думаю, что мне нужно оценить, если значение inputField = Нет, и установить для этого визуализированное значение true - я не уверен, как, хотя ...

<apex:outputPanel id="appraiserInfo">
<apex:pageBlockSection title="Testing" columns="2" rendered="{!rfp.are_you_kp__c == 'No'}">
    <apex:pageBlockSectionItem>
        <apex:outputLabel value="Single Point of Contact" for="spoc"/>
            <apex:selectList id="spoc" value="{!rfp.SPOCL__c}" size="1" title="Single Point of Contact Select">
            <apex:selectOptions value="{!SPOCS}"></apex:selectOptions>
            </apex:selectList>
    </apex:pageBlockSectionItem>
</apex:pageBlockSection></apex:outputPanel>

Хорошо, еще одна попытка - на этот раз это работает, но я не совсем понимаю, почему ... только то, что он делает.Это в дополнение к добавлению action = "{! UpdateAnswer}" в actionSupport выше (или ниже, в зависимости от того, как вы это видите)

    public pageReference updateAnswer(){
       if(this.p.are_you_kp__c == 'No')
       rfp.are_you_kp__c = 'No';
       try{
        update rfp;
          }
        catch (DmlException ex){
            ApexPages.addMessages(ex);
            return null;
       }
       return null;
    }

Вероятно, соответствующий код контроллера

public ProposalExtension(ApexPages.StandardController pCon) {
    this.p = (Proposal__c)pCon.getRecord();
}

1 Ответ

5 голосов
/ 24 января 2012

Оберните элемент в <apex:outputPanel> и повторите его, а не тот элемент, который вы хотите отобразить. Проблема в том, что элемент отсутствует на странице, когда он не отображается, поэтому он не является рабочей целью для повторного отображения.

Это то, что часто ловит людей, в том числе и я - я написал об этом в блоге: http://www.laceysnr.com/2011/10/using-rerender-to-render-one-solution.html

** РЕДАКТИРОВАТЬ **

До этого не замечал, что в вашем теге <apex:actionSupport> не указано действие. Вы можете использовать это для вызова действия на контроллере. Поскольку список выбора записывает в нужное вам значение, вам на самом деле ничего не нужно делать в коде (если вы этого не хотите), вы можете просто сделать это:

// controller
public Pagereference UpdateAnswer()
{
  // do some stuff if you want
  return null
}

// page
<apex:actionSupport action="{!UpdateAnswer}" status="StatusChange" event="onchange" rerender="PageErrors, appraiserInfo"/>

Надеюсь, это поможет!

...