Java 提交表单时,将select和textfield作为禁用字段和隐藏字段。未正确存储值

Java 提交表单时,将select和textfield作为禁用字段和隐藏字段。未正确存储值,java,struts2,Java,Struts2,我有一个屏幕,当我第一次进入屏幕(查看模式)时,我希望禁用该屏幕上的组件。当我点击编辑按钮时,一个动作被触发,我重新加载相同的屏幕,组件(cName和cStatus)为可编辑。以前,在重新加载屏幕时,我无法保留cID、cName和cStatus的值,因此我创建了3个同名的隐藏字段。现在我可以在可编辑模式(修改模式)下保留所有3页的值 细节 现在我的问题是, 假设我在cName中有值“xyz”,在cStatus中有值“Single”。 在修改模式中,我将cName中的值更改为“xyza”,cS

我有一个屏幕,当我第一次进入屏幕(查看模式)时,我希望禁用该屏幕上的组件。当我点击编辑按钮时,一个动作被触发,我重新加载相同的屏幕,组件(cName和cStatus)为可编辑。以前,在重新加载屏幕时,我无法保留cID、cName和cStatus的值,因此我创建了3个同名的隐藏字段。现在我可以在可编辑模式(修改模式)下保留所有3页的值


细节
现在我的问题是, 假设我在cName中有值“xyz”,在cStatus中有值“Single”。 在修改模式中,我将cName中的值更改为“xyza”,cStatus中的值更改为“已婚”,并提交表单。 在action类中,我接收的值对象设置为 cName=“xyz,xyza” cStatus=“单身,已婚” 而不是 cName=“xyza”
cStatus=“marred”

当我想做类似的事情时,我使用JavaScript将任何修改的值存储到隐藏变量中。这可以在控件上的onchange事件、表单上的onsumbit事件或退出编辑模式时触发。使用Prototype或jQueryJavaScript库,这些类型的操作非常容易


由于您有两个名为cName的文本字段,如果启用禁用的文本字段,则在提交时将得到两个结果。您也可以给他们起不同的名字。

在代码中进行以下简单更改:

<s:if test="%{mode=='view'}">
     <s:hidden name="cName" />
     <s:hidden name="cStatus" />
</s:if>

如果需要比较这些值以了解输入是否已更改,请使用另一个变量名来存储隐藏的值。您可以将代码更改为:

     <s:hidden value="cName" name="prevCName"/>
     <s:hidden value="cStatus" name="prevCStatus"/>

您只需将
编辑按钮设置为一个操作,并将
读取模式
显示表单发布到该操作,即可获取并填充字段

但是,添加一个
onsubmit
javascript事件,以便在单击
edit按钮时启用
disabled
控件,这样这些字段也会被发送


如果您不想使用javascript,解决方法可能是将选择框显示为文本字段,并在
读取模式期间将其设置为
只读
,以解决我添加的此问题

 <s:if test="%{mode=='view'}">
 <s:hidden name="cName" />
 <s:hidden name="cStatus" />
 </s:if>


语句,即我仅在视图模式下使用隐藏标记。现在在修改模式下,由于textfield和select标记都已启用,Value对象将自动设置,因此无需传递隐藏值。现在可以工作了。

可以为cName、cStatus和textfield定义相同的名称吗?我认为,这可能会产生问题。给cName和cStatus赋予相同的名称会给我带来问题。现在正确执行吗?因为它仍然包含相同的名称字段(隐藏字段和文本字段),我认为,如果您可以使用文本字段和使用隐藏字段,将解决您的问题现在我向jsp添加了语句,即我仅在视图模式下使用隐藏标记。现在在修改模式下,由于textfield和select标记都已启用,Value对象将自动设置,因此无需传递隐藏值。现在开始工作了。
 <s:if test="%{mode=='view'}">
 <s:hidden name="cName" />
 <s:hidden name="cStatus" />
 </s:if>