我正在尝试将我的应用设为“Bookmarkable”,我正在使用视图参数来实现它。
我认为即使在阅读this以及其他许多人之后,我仍然无法正确地在JSF中做到这一点。
我的问题是在任何非ajax回发之后get参数会丢失,我的意思是,参数值仍然在bean中设置并且应用程序正常工作,但它会从URL中删除,从而使URL无效。 / p>
例如,拥有类似http://company.com/users?id=4的网址,只要该网页执行非ajax回发(例如,用于上传数据),网址就会变为http://company.com/users。该应用程序继续正常工作,但链接不再是“Bookmarkable”。
有没有办法阻止非ajax回发从网址中删除viewParams?
我的用例是能够将页面加入书签以编辑对象,并且我需要能够上传数据(如果不是我不会使用非ajax回发)。我知道如果我想将页面加入书签只查看对象的数据,我就不需要任何回发,但这不是我的情况。
我也可以使用相同的参数重定向到相同的页面,让app重新创建视图范围的bean,但是我真的看不到任何有关请求范围bean的好处......
非常感谢任何建议。
答案 0 :(得分:2)
此行为是“按设计”。 <h:form>
生成带有<form>
网址的HTML action
元素,不带任何视图参数。同步POST请求只是提交到该URL,因此在浏览器的地址栏中按原样反映。如果您打算在URL中保留视图参数,而使用ajax不是一个选项,那么您基本上需要创建一个自定义ViewHandler
,其中getActionURL()
被覆盖以包含视图参数。 <h:form>
使用此方法生成action
网址。
public String getActionURL(FacesContext context, String viewId) {
String originalActionURL = super.getActionURL(context, viewId);
String newActionURL = includeViewParamsIfNecessary(context, originalActionURL);
return newActionURL;
}
或者,由于您的评论基于已使用OmniFaces的评论,您还可以使用<o:form>
component,Handling view parameters in JSF after post基本上扩展<h:form>
includeViewParams
属性与<h:link>
和<h:button>
中的内容非常相似。
<o:form includeViewParams="true">
...
</o:form>
这样,所有<f:viewParam>
值都将以表单操作网址结束。