Вопрос

Я пытаюсь сохранить переменную сеанса, а затем использовать ее для изменения меню в Boot.scala.Вот как я сохраняю переменную во фрагменте:

object sessionUserType extends  SessionVar[String](null)
  def list (xhtml : NodeSeq) : NodeSeq = {

    Helpers.bind("sendTo", xhtml, 
                 "provider" -> SHtml.link("/providerlogin",() => sessionUserType("provider"), Text("Provider")),
                 "student" -> SHtml.link("/studentlogin",() => sessionUserType("student"), Text("Student")))
    }

Затем в Boot.scala я делаю это:

val studentSessionType = If(() => S.getSessionAttribute("sessionUserType").open_!.equals("student"),
            "not a student session") 

Я также пытался вызвать объект по имени (sessionUserType), но он так и не смог его найти, поэтому я подумал, что это может сработать, но я продолжаю получать пустое поле при доступе к нему, хотя фактическая привязка и функция выполняются до рендеринг меню.

Любая помощь приветствуется.

Спасибо

Это было полезно?

Решение

Чтобы получить значение из SessionVar или RequestVar, вызов is метод на нем, т.е. sessionUserType.is

Кстати, ты читал"Управляющее государство"?

Примечание

Я считаю RequestVar лучше подойдет в вашем случае.Я не уверен, что смогу правильно уловить ваш код без контекста, но его можно переписать хотя бы так:

case class LoginType
case object StudentLogin extends LoginType
case object ProviderLogin extends LoginType

object loginType extends RequestVar[Box[LoginType]](Empty)
// RequestVar is a storage with request-level scope

...
"provider" -> SHtml.link("/providerlogin",() => loginType(Full(ProviderLogin)), Text("Provider")),
// `SHtml.link` works in this way. Your closure will be called after a user
// transition, that is when /providerlogin is loading.
...

val studentSessionType = If(() => { loginType.is map {_ == StudentLogin} openOr false },
                "not a student session")
// As a result, this test will be true if our RequestVar holds StudentLogin,
// but it will be so for one page only (/studentlogin I guess). If you want
// scope to be session-wide, use SessionVar

Другие советы

Я думаю, что разница в том, что вы предполагаете, что Атрибут сеанса будет соответствовать вашему SessionVar, а это не так.Лифт - это очень безопасный Framework, и один, если его функции заключаются в том, что Lift создает непрозрачные гииды для обозначения компонентов на стороне сервера.

Если ты хочешь getSessionAttribute чтобы что-то вернуть, подумайте, как можно позвонить setSessionAttribute.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top