提交包含select和textfield的表单作为禁用和隐藏字段。值未正确存储

时间:2011-11-04 05:04:28

标签: java struts2

我有一个屏幕,我希望在我第一次遍历屏幕时禁用组件(查看模式)。当我单击“编辑”按钮时,将触发一个操作,然后我将组件(cName和cStatus)重新加载到可编辑的同一屏幕。以前,当重新加载屏幕时,我无法保留cID,cName和cStatus的值,因此我创建了3个具有相同名称的隐藏字段。现在我能够以可编辑模式(修改模式)保留所有3个页面的值。

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <%@ taglib prefix="s" uri="/struts-tags"%>
 <html>
 <head>
 </head>
 <body>
 <s:form name="c" validate="true">
<s:hidden name="cID" />
<s:hidden name="cName" />
<s:hidden name="cStatus" />

<table cellspacing="0" cellpadding="3">
    <tr>
        <s:if test="%{mode=='view'}">
            <td><s:submit name="btnEdit" value="Edit" onclick="onEdit()" /></td>
        </s:if>
        <s:elseif test="%{mode=='modify'}">
            <td><s:submit name="btnSave" value="Save" onclick="onSave()" /></td>
        </s:elseif>
        <td><s:submit name="btnBack" value="Back" onclick="onBack()" /></td>
    </tr>
</table>
<fieldset style="width: 60%"><legend>Details</legend>
<table cellspacing="0" cellpadding="5" width="100%">
    <tr>
        <td><s:label name="ID" value="ID" /></td>
        <td><s:label name="cID" /></td>
    </tr>
    <tr>
        <td><s:label name="Name" value=" Name" /></td>
        <s:if test="%{mode=='view'}">
            <td><s:textfield name="cName" disabled="true" /></td>
        </s:if>
        <s:elseif test="%{mode=='modify'}">
            <td><s:textfield name="cName" id="id2" /></td>
        </s:elseif>
    </tr>
    <tr>
        <td><s:label name="CStatus" value="Status" /></td>
        <s:if test="%{mode=='view'}">
            <td><s:select name="cStatus"
                list="#{'Y':'Active', 'N':'Inactive'}" disabled="true" /></td>
        </s:if>
        <s:elseif test="%{mode=='modify'}">
            <td><s:select name="cStatus"
                list="#{'Y':'Active','N':'Inactive'}" /></td>
        </s:elseif>
    </tr>
</table>
</fieldset>
 </s:form>
 </body>
 </html>

现在我的问题是, 假设我在cName中有值“xyz”,在cStatus中有“Single”。 在修改模式中,我将值更改为cName中的“xyza”和cStatus中的“已婚”并提交表单。 在动作类中,我收到设置为的值对象 cName =“xyz,xyza” cStatus =“单身,已婚” 代替 CNAME = “XYZA” cStatus =“已婚”

4 个答案:

答案 0 :(得分:3)

在代码中进行这个简单的更改:

<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"/>

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

要解决此问题,我添加了

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

语句到jsp,即我只在查看模式下使用隐藏标记。现在处于修改模式,因为启用了textfield和select标签,因此自动设置Value Object,因此无需传递隐藏值。它现在正在工作。

答案 3 :(得分:0)

您只需将Edit button设置为操作并将read mode显示表单发布到操作中,即可获取并填充字段。

然而,在点击onsubmit时添加disabled javascript事件以启用edit button控件,以便也会发送这些字段。

如果您不想使用javascript,则解决方法可能是将选择框显示为文本字段,并在readonly期间将其设置为read mode