Как вызвать командную кнопку без проверки всех необходимых входов?

Я пытаюсь сделать перенаправление с index.xhtml на registerFirstTime.xhtml.

Код на странице index.xhtml:

<h:form id="content" style="margin-top: 1em;">
    <p:panel id="panel" header="LOGIN">
        <p:messages id="msgs" globalOnly="true"/>
        <h:panelGrid columns="3">
            <h:outputLabel value="e-mail" />
            <p:inputText id="name" required="true" value="#{UserBean.email}"
                requiredMessage="Required: e-mail" display="icon">
            </p:inputText>
            <p:message id="msgName" for="name"/>
            <h:outputLabel value="Password" />
            <p:password id="password" required="true" value="#{UserBean.password}"
                requiredMessage="Required: Password" display="icon" feedback="false">
            </p:password>
            <p:message id="msgPassword" for="password"/>
        </h:panelGrid>
        <h:panelGrid columns="2">
            <p:commandButton value="Login" actionListener="#{UserBean.validate}" update="msgNombre, msgPassword, msgs"/>
            <h:commandButton value="Register for the first time" action="register"/>
        </h:panelGrid>
    </p:panel>
</h:form>

В то время как содержимое перенаправления в Face-config.xml:

<navigation-rule>
    <from-view-id>index.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>register</from-outcome>
        <to-view-id>registerFirstTime.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>

Пока введенные имя и пароль не заполнены, вы не сможете выполнить перенаправление. Как я могу сделать перенаправление записи без учета обязательных полей? Спасибо! знак равно

2 ответа

Решение

Добавлять immediate="true" на командную кнопку, которая должна пропустить обработку всех полей ввода, которые не имеют immediate="true" приписывать.

<h:commandButton value="Register for the first time" action="register" immediate="true" />

Не имеет отношения к конкретной проблеме, обратите внимание, что технически вы не отправляете перенаправление сюда. Это в основном отправляет вперед, то есть URL в адресной строке браузера остается URL страницы входа в систему. Вам нужно добавить <redirect/> к <navigation-case>, Также обратите внимание, что навигационные случаи являются остатком JSF 1.x. Начиная с JSF 2.x вы можете выполнять "неявную навигацию", в которой вы просто указываете идентификатор представления в качестве результата.

<h:commandButton value="Register for the first time" action="registerFirstTime?faces-redirect=true" immediate="true" />

Таким образом, вы можете избавиться от случая навигации в целом.

Решение @BalusC, как всегда, должно помочь. Но я хотел бы отметить пару вещей, поскольку вы, кажется, используете Primefaces. Оба не имеют отношения к вопросу, но могут помочь вам в какой-то момент.

Во-первых, вы можете использовать неявную навигацию (введено в JSF2). Таким образом, вам не нужно будет определять все правила навигации в вашем файле face-config.xml (я работаю над старым проектом JSF 1.2 и ненавижу необходимость определять роли навигации для всего). Вот как вы это сделаете:

<h:commandButton value="Register for the first time" action="registerFirstTime.xhtml?faces-redirect=true"/>

Параметр Face-Redirect форсирует перенаправление вместо форварда, если вам это нужно.

Также, скажем, вы хотите правильно обработать некоторые значения, но не все. В этом случае вы можете использовать атрибут процесса p: commandButton или p: ajax. Например

<h:commandButton value="Register for the first time" action="registerFirstTime.xhtml?faces-redirect=true" process="@this, name"/>

Это заставит JSF обрабатывать только кнопку (@this) и компонент с id="name" (поле вашей электронной почты). Опять же, это, вероятно, не относится к этому вопросу, но это то, что я часто использую.

Другие вопросы по тегам