Добрый день.
Вопрос может и совсем простой, но не нашел примеров в документации по VisualForce.
Сделал простую форму для редактирования контакта.
Вот код.
<apex:form >
<apex:pageBlock >
<apex:pageBlockSection columns="1">
<apex:inputField value="{!contact.FirstName}"/>
<apex:inputField value="{!contact.LastName}"/>
<apex:inputField value="{!contact.Email}"/>
<apex:inputField value="{!contact.Contact_Level__c}"/>
<apex:inputField value="{!contact.AccountId}"/>
</apex:pageBlockSection>
<apex:commandButton action="{!save}" value="Save" style="margin-right:5px"/>
<apex:commandButton action="{!URLFOR("/apex/ContactsList")}" value="Cancel"
</apex:pageBlock>
</apex:form>
Есть две кнопки – Save и Cancel.
На форме присутствует встроенный механизм проверки заполнения обязательных полей по щелчку на кнопки.
Для кнопки Save это отлично, но вот для Cancel эта проверка тоже срабатывает, а это совсем не нужно, при отмене требуется просто вернуться на заданную страницу.
Как можно отключить проверку полей формы для Cancel?
action="{!cancel}"
Стандартный "Action" у всех контроллеров.
У меня свой контроллер.
Но даже если использовать стандартный контроллер Contact, то все равно action="{!cancel}" не отрабатывает, пока не заполнено обязательное поле на форме.
Если заполнить поля - тогда отмена работает.
То есть проверка полей на форме идет до выполнения действия в контроллере.
Immediate="true"
Нет, не помогает.
Если без standardController то у меня есть вот такое решение, которое работает
<apex:commandButton action="{!goBackToXXXRecord}" value="Go back" />public PageReference goBackToXXXRecord() {
if (XXXId != null) {
return new PageReference('/../' + XXXId);
} else {
return new PageReference('/..');
}
}Но вообще, если у тебя там какой-то встроенный механизм влидации, то почитай документацию по этому механизму и найди, как отключать ее в определенных (как эта) ситуациях. В стандартном Visualforce все отрабатывает прекрасно.
Что значит не помогает? Это как раз и предназначено для твоего случая!
Проще сделать это средствами Javascript чем дергать SF без надобности.
top.location.href="your_url"
Всем спасибо.
Методом научного тыка узнал в чем дело.
<apex:page controller="SaveContact" showHeader="false" sidebar="false" applyHtmlTag="false" applyBodyTag="false" docType="html-5.0">
А вот если без docType="html-5.0", то кнопка Cancel работает отлично, и со стандартным контроллером, с нестандартным, immediate='true' не нужно.
<apex:page controller="SaveContact" showHeader="false" sidebar="false" applyHtmlTag="false" applyBodyTag="false">
Не знаю, критично ли отсутствие docType="html-5.0" в заголовке...
Я указываю docType="html-5.0" для того, чтоб использовать apex:input. Все работает отлично.
Хорошо, что все решилось.
apex:input работает и без docType="html-5.0" (он появился задолго до того как html 5.0 вошел в повседневное использование) Но при включенном docType="html-5.0" появляется валидация формы на стороне браузера.
Не знаю, Дима, как "твой" СФ, а мой СФ говорит
Error: Component <apex:input> in '/apex/ХХХ' requires HTML docType version 5.0 or higher in ХХХ at line 170 column 57
А! Все возможно. Наверное в каком-то из релизов решили отказаться от поддержка старой версии html. Я так написал потому что помню еще годика 3 такой проблемы не было.
А так как я уже 3-й год активно практикую ангуляр с JS то поэтому можно сказать что не в теме. Спасибо что просвятил!!! ![]()
А я как раз использую по возможности исключительно чистый Visualforce.