actionSubmit
用途
创建一个提交到指定action的按钮.在一个form表单里,允许有多个提交按钮.使用时 Javascript 脚本时象在HTML 的使用一样.
示例
<g:actionSubmit value="Update" />
<g:actionSubmit value="${message(code:'label.update')}" action="Update" />
<g:actionSubmit value="Delete" />
<g:actionSubmit value="DeleteAll" onclick="return confirm('Are you sure???')" />
描述
属性
value
(必需) - 当没有明确指定时,按钮和action的名称.
action
(可选) - 提交执行的action名称, 若不选时,将提交默认提交到名和value值一样的action.
在一个form里,使用一个常规的提交按钮时,form自己决定请求的URL,被请求URL的action被执行. 然而,这个标签会覆盖常规按钮的行为,来确定哪个action会被执行. 值得注意的是,仍然是form决定了控制器.
如果不是必需,在form里的action不被指定,标签将会按预期设定的工作. URL 在浏览器的地址很可能包括在form里指定的action名称,不是被指定的 actionSubmit
标签.在这种情况下,使用自定义的 URL mappings是一个好主意.
URL Mappings
actionSubmit
标签的执行意味着这不是一个好方法与URL映射,尤其是在默认时. 因为 URL 映射影响请求的URL, actionSubmit
可以使用一个参数去指定执行哪个aciton. 这意味着,在URL mapping 和要执行的action之间匹配错误. 用一个简单的例子,URL的映射在默认情况下的例子:
class UrlMappings {
static mappings = {
"/$controller/$action?/$id?"{
constraints {
// apply constraints here
}2
}
}
}
和一个包括一个简单form表单的 GSP 页:
<g:form controller="test">
<g:actionSubmit value="Submit" action="success"/>
</g:form>
URL 生成一个 提交到".../test" 或 ".../test/index" (假设 "index" 是一个默认的action)<form>
元素 ,这将取决于 Grails的版本. 注意的是,当点击提交按钮时,在URL里既不包含 "success"信息, 也不会在浏览器上提示"success"的信息.
form表单请求的URL中不包含action的名称,不过这不是一个太大的问题.如果你有一个可添加默认action的 Grails 版本, 你可以指定一个action在 <g:form>
标签中, 然后你可用一个自定义的URL mapping 隐藏action的名称:
"/test/submit" {
controller = "test"
action = "index"
}
在 mapping 指定的action,不是默认的action/controller, 就是在 <g:form>
标签里指定的.
注意的是,这个标签依靠多解析器,检查多个请求里的参数. 在 Config.groovy里,把 grails.disableCommonsMultipart 设为true, actionSubmit 失效.
来源
Show Source
def actionSubmit = {attrs ->
attrs.tagName = "actionSubmit"
if (!attrs.value) {
throwTagError("Tag [$attrs.tagName] is missing required attribute [value]")
} // add action and value
def value = attrs.remove('value')
def action = attrs.action ? attrs.remove('action') : value out << "<input type=\"submit\" name=\"_action_${action}\" value=\"${value}\" " // process remaining attributes
outputAttributes(attrs) // close tag
out << '/>' }