当前位置: 代码迷 >> Web前端 >> 关于实现添加相关图书功能的一些有关问题
  详细解决方案

关于实现添加相关图书功能的一些有关问题

热度:204   发布时间:2012-10-24 14:15:58.0
关于实现添加相关图书功能的一些问题

1.参考Grails实现复杂的数据录入,实现了为图书添加相关图书的功能,但是在随后的测试中

发现了一些问题,现将这些问题列举出来,

(1)当进入新建页面的时候,什么数据也不填,点击保存按钮,如果你在domain类中添加了约

束条件,如果按照正常的情况是应该在页面上显示报错信息。但是此时页面没有报错,但是数

据也没录入,该怎样解决这个问题了。

例如当保存不成功时我们返回到添加页面,如果你的代码类似这样的话

render(view:"create")或者redirect(action:"create")这时就会出现上面的问题。

解决办法,我们在controller中判断保存是否成功的逻辑中假如如下代码:

将代码修改成为

render(view: "newedit",?model: [bookInstance: book])

注意红字部分,保存代码,运行程序,重复上边的步骤。这时会在页面上显示报错信息。

image

(2)如果我们进入编辑页面的话,此时你会发现页面没数据。这问题可以这样解决,原代码如

下:

def edit={?
book=Book.get(params.id)?
}

我们将其修改如下:

def edit = {?
def bookInstance?
if(params.id){//如果有参数,则表明是要进入编辑页面

bookInstance = Book.get(params.id)

}else{//没有参数,则表示新建?
bookInstance = new Book()

bookInstance.properties = params

}?
return [bookInstance: bookInstance]//得返回这个,否则在编辑页面没值?
}

注意红字部分。

ok,保存代码,运行程序,再次进入编辑页面就会出现数据了。

(3)如果我们浏览某本书的详细页面,相关图书那里会有一些问题,出现的数据会有中括号包起

来,如下图所示:

image

解决方法如下:我们可以写一个循环把它的值取出然后显示出来,正好grails给我们提供了

<g:each>标签,示例如下:

<g:each in="${bookInstance?.relativeBooks}" var="relativeBooks">

<li>${relativeBooks.cName}</li>

</g:each>

ok,保存代码,运行程序,效果如下,当然你可以给给它的显示样式做下改变,这就涉及到

CSS了,这里就不做讨论了。

image

ps:这是最近遇见的一个问题,在测试页面时发现,当我编辑一个图书时,我将该图书的相关

图书删除一些后,然后点击保存,然后再查看该图书的详细信息时发现,该图书的相关图书没

有改变,还是原来的那些,如果我在编辑时,删除一些相关图书,然后再添加一些的话,再查

看详细图书时,发现相关图书会出现混乱,一本书可能出现两次,通过在控制台打印信息发

现,该图书的相关图书,Book.relativeBooks,例如你新建的一本书的相关图书有3本,那么

这个Book.relativeBooks的长度为3,这个长度只能增加,不会再减少。仔细检查代码,最终

找到了解决方法。

def edit = {?
def bookInstance?
if(params.id){//如果有参数,则表明是要进入编辑页面

bookInstance = Book.get(params.id)

}else{//没有参数,则表示新建?
bookInstance = new Book()

book.relativeBooks = null//将其相关图书清空

bookInstance.properties = params

}?
return [bookInstance: bookInstance]//得返回这个,否则在编辑页面没值?
}

在原action中加入红色字体的代码,现将相关图书清空,然后再利用properties属性,为

book赋值。

ok再次测试程序,这次程序没有问题了。

  相关解决方案