1

我想将带有 id 的标签和带有 id 的输入字段添加到具有自己的 id 的面板组(布局框)。我希望标签和输入字段具有以下 id: (viewid):(formid):(panelgroupid):(own id) 但不知何故 panelgroupid (fachlich1) 不会传递给孩子。

<form id="viewns_Z7_6PQJDK4JGD09F0I34QTLQH2015_:j_id_3" …&gt;
    <div id="viewns_Z7_6PQJDK4JGD09F0I34QTLQH2015_:j_id_3:fachlich1">
        <label id="viewns_Z7_6PQJDK4JGD09F0I34QTLQH2015_:j_id_3:label" for="viewns_Z7_6PQJDK4JGD09F0I34QTLQH2015_:j_id_3:value">Bla</label>
        <input id="viewns_Z7_6PQJDK4JGD09F0I34QTLQH2015_:j_id_3:value" type="text" value="Blubb34534" name="viewns_Z7_6PQJDK4JGD09F0I34QTLQH2015_:j_id_3:value">
    </div>
</form>

任何线索我可能做错了什么?:(

谢谢你的帮助!


编辑:

我想创建自己的组件,该组件基本上由周围的 div + label + inputtext 组成。我从 HtmlPanelGroup 扩展并覆盖 encodeBegin 方法,在其中我将布局设置为块,设置面板组的 id,添加组件,之后我调用 super.encodeBegin:

public void encodeBeginn(FacesContext context)
{
    setLayout("block");
    setId(getId());

    HtmlOutputLabel label = new HtmlOutputLabel();
    label.setId("label");
    label.setFor("value");
    label.setValue(getLabel());
    getChildren().add(label);

    HtmlInputText text = new HtmlInputText();
    text.setId("value");
    text.setValue(getValue());
    getChildren().add(text);

    super.encodeBeginn(context)
}
4

3 回答 3

4

只有NamingContainer接口的实现会将自己的 ID 添加到其子 ID 的前面。根据javadoc,它是以下组件:

所有已知的实现类:

HtmlDataTable, HtmlForm, UIData, UIForm,UINamingContainer

HtmlPanelGroup支持的<h:panelGroup>不在其中。在标准 JSF 中,只有<h:dataTable>实现<h:form>它。在标准 Facelets 中,也仅<ui:repeat>实现它(通过UINamingContainer)。

这根本不应该形成任何技术问题。如果您认为您的具体问题(您在问题中没有说明任何内容)是由此引起的,那么您可能已经找到了错误的原因,并且必须从不同的方向寻找具体问题的原因。

于 2012-07-02T13:59:06.453 回答
0

正如您在评论 BalusC 答案时提到的,可以让自定义组件实现 NamingContainer。我尝试了类似的方法,因为您的自定义组件基本上只是一个复合组件,您周围的 HtmlPanelGroup 将成为内部组合组件的 NamingContainer。

不过要小心,不要用其他名称覆盖 getFamily。这让我发疯了,直到我发现当你这样做时,JSF 找不到标准渲染器(向 HtmlPanelGroup 注册的渲染器)。

public class MyComponenten extends HtmlPanelGroup implements NamingContainer {

    public void encodeBeginn(FacesContext context){
        ...fill with components
        super.encodeBeginn(context);
    }
...
于 2012-07-03T13:27:39.963 回答
0

明确指定 id in<h:form> 并设置prependId=falseinh:form

于 2012-07-02T13:40:30.567 回答