我有一个屏幕,我希望在我第一次遍历屏幕时禁用组件(查看模式)。当我单击“编辑”按钮时,将触发一个操作,然后我将组件(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 =“已婚”
答案 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
。