【问题标题】:(Resolved, Bypassed) Grails: how to pass model to the view of another controller?(已解决,已绕过) Grails:如何将模型传递给另一个控制器的视图?
【发布时间】:2012-01-25 01:29:22
【问题描述】:

我是 grails 新手,无法找到如何在控制器之间传递模型的答案。

我有这样的情况,有潜在客户视图和客户请求视图。

用户可能希望根据潜在客户信息创建客户请求。

我考虑填充模型对象包括PotentialClientController 的transorm 动作并将其ClientRequestController 的创建动作。如果用户能够在保存之前编辑数据,那将是一件好事,并且他可能会决定不保存它。所以我不想在 transform 动作中保存填充的 ClientRequest 实例,我想将它传递给另一个控制器的 create 视图。而且我不想在 create 操作中处理 params。当然,我可以传递已经存在的对象的 id 并在 create 操作中使用它们,但是传递模型对我来说会更简单。

正确的做法是什么?

以下是我正在尝试做的示例: 潜在客户控制者的转换动作:

def transform = {
    def requestor = User.getByUsername(principal.username)

    def potentialClientInstance = PotentialClient.get( params.id )
    boolean hasEnoughtRights = checkRights()
    if(!hasEnoughtRights) {
        redirect(controller: 'login', action: 'denied')
    }

    ClientRequest clientRequestInstance = new ClientRequest()

    ContactPerson contactPersonInstance = ContactPerson.get(potentialClientInstance?.contactPerson?.id)
    Contact mobilePhoneContactInstance
    Contact workPhoneContactInstance
    Contact homePhoneContactInstance
    Contact organizationPhoneContactInstance
    Contact emailContactInstance
    ...........................

    clientRequestInstance?.ownedBroker = requestor
    clientRequestInstance?.organization = Organization.get(potentialClientInstance?.organization?.id)
    clientRequestInstance?.brand = new Brand(name: clientRequestInstance?.organization?.getBrandsString())
    clientRequestInstance?.estateType = EstateTypeDic.get(potentialClientInstance?.estateType?.id)
    clientRequestInstance?.footageFrom = potentialClientInstance?.footageFrom
    clientRequestInstance?.footageTo = potentialClientInstance?.footageTo
    clientRequestInstance?.priceFrom = potentialClientInstance?.priceFrom
    clientRequestInstance?.priceTo = potentialClientInstance?.priceTo
    clientRequestInstance?.currency = CurrencyDic.get(potentialClientInstance?.currency?.id)
    clientRequestInstance?.requestComment = Comment.get(potentialClientInstance?.comment?.id)
    clientRequestInstance?.comments?.setComments(potentialClientInstance?.comments)
    clientRequestInstance?.district = District.get(potentialClientInstance?.address?.district)
    clientRequestInstance?.addedBy = requestor
    clientRequestInstance?.modifiedBy = requestor


    chain (controller: 'clientRequest', action: 'create', model: [clientRequestInstance:clientRequestInstance, contactPersonInstance:contactPersonInstance, mobilePhoneContactInstance:mobilePhoneContactInstance, workPhoneContactInstance:workPhoneContactInstance, homePhoneContactInstance:homePhoneContactInstance, organizationPhoneContactInstance:organizationPhoneContactInstance, emailContactInstance:emailContactInstance,])
}

创建客户端请求控制器的动作

def create = {
        def clientRequestInstance = new ClientRequest()
        clientRequestInstance.properties = params
        return ['clientRequestInstance':clientRequestInstance]
}

【问题讨论】:

  • 我想我知道原因,这是由于在 create action 中创建了新对象 :) def clientRequestInstance = new ClientRequest() 但我仍然无法通过我的模型...

标签: grails view model controller


【解决方案1】:

解决方案非常简单。

我在转换操作中使用了重定向,并将潜在客户的 id 作为参数传递:

def transform = {
        def requestor = User.getByUsername(principal.username)

        def potentialClientInstance = PotentialClient.get( params.id )
        boolean hasEnoughtRights = checkRights()
        if(!hasEnoughtRights) {
                redirect(controller: 'login', action: 'denied')
        }

    redirect(controller: 'clientRequest', action: 'create', params: [potentialClientId: params.id])
}

然后使用此 id 获得所需的潜在客户实例并在客户端请求控制器的创建操作中使用相同的代码填充模型:

def create = {

        def clientRequestInstance = new ClientRequest()
        def requestor = User.getByUsername(principal.username)

        ContactPerson contactPersonInstance
        Contact mobilePhoneContactInstance
        Contact workPhoneContactInstance
        Contact homePhoneContactInstance
        Contact organizationPhoneContactInstance
        Contact emailContactInstance
        if(params.potentialClientId) {
            PotentialClient potentialClientInstance = PotentialClient.get(params.potentialClientId)

            clientRequestInstance = new ClientRequest()

            contactPersonInstance = ContactPerson.get(potentialClientInstance?.contactPerson?.id)

                          ...............................

            clientRequestInstance?.ownedBroker = requestor
            clientRequestInstance?.organization = Organization.get(potentialClientInstance?.organization?.id)
            clientRequestInstance?.organization?.ownedBroker = requestor
            String brands = clientRequestInstance?.organization?.getBrandsString()
            if(brands) {
                clientRequestInstance?.brand = new Brand(name: clientRequestInstance?.organization?.getBrandsString())
            }
            clientRequestInstance?.estateType = EstateTypeDic.get(potentialClientInstance?.estateType?.id)
            clientRequestInstance?.footageFrom = potentialClientInstance?.footageFrom
            clientRequestInstance?.footageTo = potentialClientInstance?.footageTo
            clientRequestInstance?.priceFrom = potentialClientInstance?.priceFrom
            clientRequestInstance?.priceTo = potentialClientInstance?.priceTo
            clientRequestInstance?.currency = CurrencyDic.get(potentialClientInstance?.currency?.id)
            clientRequestInstance?.requestComment = Comment.get(potentialClientInstance?.comment?.id)
            potentialClientInstance?.comments?.each {
                clientRequestInstance?.addToComments(it)
            }
            clientRequestInstance?.district = District.get(potentialClientInstance?.address?.district)
            clientRequestInstance?.addedBy = requestor
            clientRequestInstance?.modifiedBy = requestor

        } else {
            clientRequestInstance.properties = params
        }
        return ['clientRequestInstance': clientRequestInstance, 'contactPersonInstance': contactPersonInstance, 
            'mobilePhoneContactInstance': mobilePhoneContactInstance,
            'workPhoneContactInstance': workPhoneContactInstance,
            'homePhoneContactInstance': homePhoneContactInstance,
            'organizationPhoneContactInstance': organizationPhoneContactInstance,
            'emailContactInstance': emailContactInstance]
    }

【讨论】:

    猜你喜欢
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多