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

Я пытаюсь сделать перенаправление с 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>

В то время как содержимое перенаправления вfaces-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>

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


person Víctor Pariente    schedule 28.06.2012    source источник
comment
Вы имели в виду перенаправление при отправке без заполнения значений ??   -  person being_uncertain    schedule 28.06.2012
comment
Да, мне нужно сделать один редирект с заполнением значений (логин), но мне нужен и другой редирект (регистрация) без заполнения значений.   -  person Víctor Pariente    schedule 28.06.2012
comment
Я доказал, что поместил h: commandButton в другую форму h:, и это работает, но есть ли возможность поместить h: commandButton в форму h: с содержимым id?   -  person Víctor Pariente    schedule 28.06.2012


Ответы (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" />

Таким образом можно вообще избавиться от навигационного корпуса.

person BalusC    schedule 28.06.2012

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

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

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

Параметр face-redirect вызывает перенаправление вместо переадресации, если вам это нужно.

Кроме того, скажем, вы хотите правильно обработать некоторые значения, но не все. В этом случае вы можете использовать атрибут process 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" (ваше поле электронной почты). Опять же, это, вероятно, не относится к этому вопросу, но я часто использую его.

person Andre    schedule 28.06.2012