2012-01-07 55 views
1

我有一个数据输入表单,用户输入大量数据。当用户访问页面查看现有数据时,页面应以只读模式显示(所有值以文本形式显示),当他单击“编辑”按钮时,应显示包含所有输入控件的普通窗体,以便用户可以更改并保存数据。使用JSF显示只读表单(值显示为文本而不是禁用的输入控件)?

我们使用JSF 2.0和PrimeFaces库。对于文本框和文本区域很容易实现上述行为,但对于复选框,多选,无线电,.....控件则无此功能。有没有我做任何可用简单的方法来实现上述行为,而不是自己编写的代码(这可能会碰到不少从而使支持bean代码丑陋线)

感谢您的帮助......

回答

4

我不知道为什么你认为你需要的额外支持bean代码。你已经拥有了支持bean中所有需要的值。你的问题更多的是呈现这些价值观。只需相应地编写视图代码,以所需的格式显示它们即可。也许你认为这太难了。

而不是选择布尔值复选框,您可以显示例如“是”或“否”值。

<h:selectBooleanCheckbox value="#{bean.checked}" rendered="#{bean.edit}" /> 
<h:outputText value="#{bean.checked ? 'Yes' : 'No'}" rendered="#{not bean.edit}" /> 

而不是选择一个菜单/收音机,您可以只显示输出文本中的值。

<h:selectOneMenu value="#{bean.selectedItem}" rendered="#{bean.edit}"> 
    <f:selectItems value="#{data.availableItems}" /> 
</h:selectOneMenu> 
<h:outputText value="#{bean.selectedItem}" rendered="#{not bean.edit}" /> 

而不是选择多个列表框/复选框,您可以只显示例如在循环中分隔的所有值逗号。

<h:selectManyListbox value="#{bean.selectedItems}" rendered="#{bean.edit}"> 
    <f:selectItems value="#{data.availableItems}" /> 
</h:selectManyListbox> 
<h:panelGroup rendered="#{not bean.edit}"> 
    <ui:repeat value="#{bean.selectedItems}" var="selectedItem" varStatus="loop"> 
     #{selectedItem}#{not loop.last ? ', ' : ''} 
    </ui:repeat> 
</h:panelGroup> 

你可以把它包装都在一个标签文件或复合材料,以尽量减少样板和代码重复。

+0

当控件的标签不等于它的值时,它并不那么简单。 – Sudhir 2012-01-09 04:08:45

+0

例如,对于选择布尔值复选框,显示给用户的值为'男'和'女'。在选择时,'M'或'F'将根据用户的选择存储在数据库中。在这种情况下,在查看模式下,要显示“男性”或“女性”,必须编写额外的支持bean代码以将数据库值转换为用户可呈现文本。其他控制也是一样。对于上述方法的工作,控制的标签必须等于价值,这在大多数情况下不会。请让我知道如果我失去了一些东西。 – Sudhir 2012-01-09 04:09:08

+0

你已经在''背后的数据中存在这些值。只需访问并相应地打印它们。将来你可以直接问一个问题,就像你在评论中所做的那样。 – BalusC 2012-01-09 11:37:36

0

这在我使用具有“预览”属性的复合组件的最后一个项目中,在实现中,当此属性为true时呈现文本,在属性为false时呈现真实(编辑)。对于预览模式下的复选框,您可以显示复选框本身但已禁用,用于收音机 - 显示所选项目。

MyFaces Tomahawk库[1]包含为此目的添加displayValueOnly属性的标准组件的扩展版本。这可能对你有帮助(我没有用过它们)。

[1] - http://myfaces.apache.org/tomahawk-project/tomahawk20/index.html

相关问题