我希望能够在我的 Salesforce 站点页面中读取/写入一些变量到当前会话。
我有一个使用 Salesforce 站点构建的站点,我需要在所有页面中存储/检索一些值(考虑我正在构建类似于购物车的东西)。但是我找不到任何关于如何在会话中读取和写入变量的好例子(匿名用户)。
我正在使用带有多个内置于 Apex 的控制器的 Visualforce 页面。
问候
我希望能够在我的 Salesforce 站点页面中读取/写入一些变量到当前会话。
我有一个使用 Salesforce 站点构建的站点,我需要在所有页面中存储/检索一些值(考虑我正在构建类似于购物车的东西)。但是我找不到任何关于如何在会话中读取和写入变量的好例子(匿名用户)。
我正在使用带有多个内置于 Apex 的控制器的 Visualforce 页面。
问候
如果您正在构建诸如购物车或“向导”之类的东西,您需要在上下文中将控制器变量从一个页面视图保存到另一个页面视图,那么在 VisualForce 中执行此操作的最佳方法是使用相同的控制器。
当用户提交表单(通过 actionFunctions、commandButtons 或 commandLinks 等),并且您的控制器返回一个页面引用时,如果新的视觉力页面使用相同的控制器,则保留视图状态。
通过这种方式,例如,您可以让用户使用第一页上的 apex:inputField 标签输入他们的姓名和电子邮件地址。他们导航到第二页,它使用与第一页相同的控制器,并且该页面可以引用相同的控制器变量。本质上,控制器仍在范围内,所有更新的变量也是如此。
例子:
第一页:
<apex:page controller="myController">
Please enter your name <apex:inputText value="{!shopper_name}"/>
<br/>
<apex:commandButton action="{!pageTwo}" value="Click for page two"/>
</apex:page>
第二页:
<apex:page controller="myController">
You entered: <apex:outputText value="{!shopper_name}" />.
</apex:page>
控制器:
public class myController {
public string shopper_name { get; set; }
public myController() {
shopper_name = null;
}
}
自定义设置在应用程序级别缓存,也许这就是上面链接中建议的原因。我不确定我是否会推荐这种方法,但你也许可以让它发挥作用。
如果您创建一个名为“SessionData”的自定义设置,并添加您的自定义字段(代表您要在会话中存储的数据),您可以像这样将数据保存到其中:
Database.SaveResult result = Database.insert(new SessionData__c(YourFieldHere='Your value here etc'));
System.debug(result.getID());
然后使用生成的自定义设置 ID 存储在 cookie 中。虽然可以使用普通 SOQL 访问自定义设置,但优点是数据被缓存并且可以像这样访问:
if (SessionData__c.getAll().containsKey('unique ID from cookie here'))
{
System.debug(SessionData__c.getInstance('unique ID from cookie here').YourFieldHere);
}
请记住,自定义设置并不是真正为此设计的,因此您需要定期清除旧的自定义设置数据,就像普通会话管理系统一样。
有关更多详细信息,请参阅Apex 自定义设置文档。
您应该为此使用Javascript cookie。
您也可以使用Apex cookies,但是您需要确保每个请求都到达服务器(而不是缓存层)。
对于 Apex Cookie,您可以使用以下代码:
//Setting Cookie
public void setCookie() {
Cookie userCookie = new Cookie('CookieName', fieldValueToBeStoredAsCookie, null, 315569260, false); //Here 315569260 represents cookie expiry date = 10 years. You can set this to what ever expiry date you want. Read apex docs for more details.
ApexPages.currentPage().setCookies(new Cookie[] {
userCookie
});
}
//Reading Cookie
Cookie cookie = ApexPages.currentPage().getCookies().get('CookieName');
if (cookie != null) {
String fieldValueToBeStoredAsCookie = cookie.getValue();
}
我认为Visualforce 视图状态可能对您有用:
包含表单组件的 Visualforce 页面还包含一个加密的隐藏表单字段,该字段封装了页面的视图状态。这个视图状态是自动创建的,顾名思义,它保存页面的状态——包括组件、字段值和控制器状态的状态。