2

我正在尝试使我的应用程序“可收藏”,并且我正在使用视图参数来实现它。

而且我认为我仍然没有在 JSF 中找到正确的方法,即使在阅读了这篇文章和许多其他内容之后也是如此。

我的问题是,在任何非 ajax 回发后,get 参数都会丢失,我的意思是,参数值仍然在 bean 中设置并且应用程序正常工作,但它会从 URL 中删除,从而使 URL 无效。

例如,有一个像http://company.com/users?id=4这样的 URL ,只要该页面执行非 ajax 回发(例如,用于上传数据),该 URL 就会变成http://company。 com/用户。该应用程序继续正常工作,但该链接不再“可收藏”。

有什么方法可以防止非 ajax 回发从 URL 中删除 viewParams?

我的用例是能够为页面添加书签以编辑对象,并且我需要能够上传数据(如果不是,我不会使用非 ajax 回发)。我知道如果我想为页面添加书签以仅查看对象的数据,我不需要任何回发,但这不是我的情况。

我也可以使用相同的参数重定向到同一个页面,并让应用程序重新创建视图范围的 bean,但是我真的看不到请求范围的 bean 有任何好处......

任何建议都非常感谢。

4

1 回答 1

2

这种行为是“设计使然”。<h:form>生成一个没有任何视图参数<form>的带有 URL 的 HTML 元素。action同步 POST 请求只是提交到该 URL,从而在浏览器的地址栏中按原样反映。如果您打算将视图参数保留在 URL 中,而使用 ajax 不是一个选项,那么您基本上需要创建一个自定义ViewHandler,它已getActionURL()被覆盖以包含视图参数。此方法用于<h:form>生成actionURL。

public String getActionURL(FacesContext context, String viewId) {
    String originalActionURL = super.getActionURL(context, viewId);
    String newActionURL = includeViewParamsIfNecessary(context, originalActionURL);
    return newActionURL;
}

或者,当您基于已经使用OmniFaces的评论时,您也可以使用它的<o:form>组件,该组件基本上扩展了<h:form>具有与in和includeViewParams中相同的属性的属性。<h:link><h:button>

<o:form includeViewParams="true">
    ...
</o:form>

这样,所有<f:viewParam>值都将在表单操作 URL 中结束。

也可以看看:

于 2013-01-07T15:55:08.083 回答