我对 Grails 还很陌生,我正在开发一项在线调查。我决定使用网络流,但遇到了很多问题。我正在尝试将调查 ID 从 gsp 页面传递到流量控制器。这在任何其他控制器操作上都工作得很好,但是每当我对流程的启动状态的操作执行此操作时,我总是会遇到相同的错误。我已经按照教科书上的教程以完全相同的方式执行此操作,但我已经没有想法了。

这是 gsp 页面的链接:

<g:link controller="surveyPage" action="beginTest" id="${survey.id}">
${survey.surveyName}
</g:link>

这是开始状态的流程

def beginTestFlow = {

    showSurvey{

        def survey = Survey.get(params.id)

        on("cancel").to "cancelSurvey"
        on("continueSurvey").to "nextQuestion"

    }

    cancelSurvey { redirect(controller:"surveyPage") }
}

它总是抛出异常:

行上的参数类型不匹配

def survey = Survey.get(params.id)

我也尝试过:

flow.survey = Survey.get(params.id)

甚至:

flow.survey = Survey.get(session.survey.id)

总是同样的错误。另外,我确保类 Survey 实现了 Serialized。我已使用相同的控制器将相同的代码复制并粘贴到不同的操作中,并且它运行完美。对于网络流程有什么不同有什么想法吗?

有帮助吗?

解决方案

您不能将这样的代码直接放在状态定义中,您需要使用操作状态或 onEntry 堵塞

def beginTestFlow = {
    showSurvey{
        onEntry {
            flow.survey = Survey.get(params.id)
        }
        on("cancel").to "cancelSurvey"
        on("continueSurvey").to "nextQuestion"
    }

    cancelSurvey { redirect(controller:"surveyPage") }
}

onEntry 块每次都会触发 showSurvey 进入状态。相反,如果您希望某些逻辑在整个流程开始时仅运行一次(例如,如果稍后的某些转换可能会重新进入初始状态),则可以使用流程级别 onStart 改为阻止:

def beginTestFlow = {
    onStart {
        flow.survey = Survey.get(params.id)
    }
    showSurvey{
        on("cancel").to "cancelSurvey"
        // ...

其他提示

ivo houbrechts写了一个关于grails 2.0 webflow的卓越教程。你可以在这里阅读:

http://livesnippets.cloudfoundry.com/docs/guide/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top