假设我有一个Domain对象Teacher,具有两个字段,字符串名称,TeacherType,TeacherType,其中TeacherType是一个包含AssitantProfessor,AssociateProfessor,Professor的枚举。
在我使用grails run-target generate-all Teacher生成视图之后,它将生成一个_form.gsp,用于创建和编辑Teacher。在编辑视图中,我只希望名称是可编辑的,但教师名称一旦创建即不可修改(这只是一个例子,这是要求某些字段在创建后不能更新)。在创建视图中,TeacherType和名称都应该是可编辑的。
由于create.gsp和edit.gsp都呈现_form模板,因此这里首选的方法是什么?
在create.gsp中:
<fieldset class="form">
<g:render template="form" model="[teacherInstance: teacherInstance, 'mode':'create']"/>
</fieldset>
Run Code Online (Sandbox Code Playgroud)
在edit.gsp中
<fieldset class="form">
<g:render template="form" model="[teacherInstance: teacherInstance, 'mode':'edit']"/>
</fieldset>
Run Code Online (Sandbox Code Playgroud)
在_form.gsp中
<g:if test="${mode == 'edit'}">
<g:select name="teacherType" from="${TeacherType?.values()}" keys="${TeacherType.values()*.name()}" required="" value="${teacherInstance?.teacherType?.name()}" disabled="disabled"/>
</g:if>
<g:else>
<g:select name="teacherType" from="${TeacherType?.values()}" keys="${TeacherType.values()*.name()}" required="" value="${teacherInstance?.teacherType?.name()}" disabled="false"/>
</g:else>
Run Code Online (Sandbox Code Playgroud)
方法2可行,但我想如果条件语句的数量增加,则最好遵循方法1并拆分表格。
还有我不知道的另一种方法吗?
(以及许多其他表单字段标签)的disabled
属性可以是布尔值表达式:<g:select>
<g:...>
<g:select name="teacherType" from="${TeacherType?.values()}"
keys="${TeacherType.values()*.name()}" required=""
value="${teacherInstance?.teacherType?.name()}"
disabled="${mode == 'edit'}"/>
Run Code Online (Sandbox Code Playgroud)
如果表达式为假disabled="disabled"
,这将呈现为表达式的计算结果为true,以及缺少disabled
属性(即不会禁用该字段)。您甚至可以在模型中使用布尔输入,例如使用
model="[teacherInstance: teacherInstance, editing:true]"
Run Code Online (Sandbox Code Playgroud)
(或editing:false
分别),然后disabled="${editing}"
在上说<g:select>
。