gpt4 book ai didi

jsf-2 - 如何提交具有转换错误的禁用输入的表单

转载 作者:行者123 更新时间:2023-12-04 04:38:07 25 4
gpt4 key购买 nike

我有以下页面/bean 结构(使用 myfaces 2.0.11 + tomcat 6)

我有一个复选框,当检查他旁边的h:inputtext(连接到我的bean中的Integer变量)时,启用了一个,并且当未选中复选框时,输入已禁用输入,并且我有一个提交按钮提交它们两者(完整表格)

这是代码

<h:form prependId="false">
<h:selectBooleanCheckbox id="my_len" value="#{myBean.myLenBool}">
<f:ajax render="my_len_input_wrapper"/>
</h:selectBooleanCheckbox>
<h:panelGroup id="my_len_input_wrapper">
<h:inputText value="#{myBean.myLen}" id="my_len_input"
disabled="#{not myBean.myLenBool}" required="#{myBean.myLenBool}">
<f:validateLongRange minimum="1"/>
</h:inputText>
<h:message for="my_len_input"/>
</h:panelGroup>

<h:commandButton action="#{myBean.submit}" value="submit">
<f:ajax render="@form" execute="@form"></f:ajax>
</h:commandButton>
</h:form>

bean 码
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class myBean {
Integer myLen;
boolean myLenBool;

public Integer getMyLen() {
return myLen;
}

public void setMyLen(Integer myLen) {
this.myLen = myLen;
}

public boolean isMyLenBool() {
return myLenBool;
}

public void setMyLenBool(boolean myLenBool) {
this.myLenBool = myLenBool;
}

public void submit() {
// submit
}

}

场景如下

1)选中复选框(输入将被启用)
2)输入一个无效值(例如0.5),其无效原因 myLen是一个 Integer3) 点击提交 -> 错误信息将显示在 h:message 转换错误的原因
4)取消选中复选框(它将禁用输入文本)
5)点击提交<---表单没有被提交导致转换错误?!?!

所以问题是:我怎样才能提交带有转换错误的禁用输入的表单???

到目前为止,我找到的唯一解决方案是编写我自己的自定义 converter,如果该字段被禁用,则忽略转换
@FacesConverter("APCustomConverter")
public class APCustomConverter extends IntegerConverter{

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {

if (component.getAttributes().get("disabled") != null && component.getAttributes().get("disabled").equals(true)) {
return null;
}
Object retValue = super.getAsObject(context, component, value);
return retValue;
}
}

希望有比我更好的解决方案(使用 CustomConverter ),

有点离题/不太离题:

这个转换错误最终让我陷入了一个非常烦人的场景:当我使用丢弃按钮时,只有 render="@form"复选框的状态和输入出错了,以至于在单击丢弃后 -> 复选框保持选中状态(虽然它不应该导致表单没有真正提交)并且输入被禁用而不是只读导致真正的复选框值是假的,并且当我再次点击提交时,复选框被真正选中但输入得到了自己的空值(所有这会导致服务器上出现空指针异常),所以最终我不得不在丢弃按钮中使用 <f:actionListener type="org.omnifaces.eventlistener.ResetInputAjaxActionListener" /> by omnifaces

最佳答案

测试莫哈拉 2.1.26 我的脸 2.0.11 .取消选中该复选框时,Mojarra 会更新 h:inputText并将其留空,这是预期的行为,因为该值从未达到模型(验证错误)。但是,MyFaces 仅将其更新为禁用模式,而将旧的输入值留在那里。

这似乎是一个 MyFaces 问题,即使在最新的 (2.1.12-2.0.18) 分支版本中也没有解决。事实上,如果您想根据其状态跳过某些元素的转换/验证,编写自定义转换器/验证器是可行的方法,但在您的情况下,问题与 MyFaces 的 ajax 循环有关,它应该像 Mojarra 的循环一样工作确实。

作为解决方案,您有三种可能的选择:

  • 如果可能,切换到 Mojarra 实现,这将使问题消失。
  • 编写一些 JS 代码,以便在未选中复选框时重置输入值。
  • 使用您当前的解决方案,它会在被禁用的情况下跳过服务器端的元素转换。
  • 关于jsf-2 - 如何提交具有转换错误的禁用输入的表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19376873/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com