【问题标题】:Grails form error handling: Binding 1:1 object mappingsGrails 表单错误处理:绑定 1:1 对象映射
【发布时间】:2011-05-01 12:24:09
【问题描述】:

我有一个注册表单,其中包含与两个域对象相关的字段;用户和个人资料。该关系是 User 域类拥有的 1:1 映射。

用户控制器上的“注册”操作会编组表单值,并在没有验证错误的情况下保留用户对象并在提交表单时重定向到应用程序根目录。否则,控制器将重定向回注册表单,显示带有失败值的预填充字段。

但是,实际上,当验证失败时,失败的值不会显示在视图中。下面是注册操作的代码:

def registration = {

}

def register = {
    def user = new User()
    bindData(user, params)
    if (user.save()) {
        flash.message = 'Successfully Registered User'
        redirect(uri: '/')
    }else {
        flash.message = 'Registration Failed!'
        redirect(action: registration, params: [ user: user ])
    }
}

以下是显示用户和配置文件相关字段的视图的示例 html 摘录:

<div class="row">
<label for="city"> City, State: </label>
<g:textField id="city" name="profile.city"
    value="${user?.profile?.city}" size="28" />
<span class="red">*</span>
</div>  
<hr />  
<div class="row">
<label for="email"> E-mail address: </label>
<g:textField id="email" name="userId" value="${user?.userId}" size="28" />
<span class="red">*</span>
</div>

从语法上看,一切看起来都不错;我正在使用适当的命名约定和 grail 的插值来访问值,所以我不知道为什么它的行为不符合预期。

任何 cmets 或建议将不胜感激。

谢谢, -汤姆

【问题讨论】:

    标签: grails grails-controller grails-validation


    【解决方案1】:

    如果我没记错的话,我认为是这样的:

    def user = new User()
    user.properties = params
    

    【讨论】:

      【解决方案2】:

      您需要以某种方式将提交的值从register 操作中的user 传递到user 操作中的registration。像这样:

      if (params.user) {
        user.properties = params.user.properties
      }
      

      【讨论】:

      • 我在注册操作中添加了以下逻辑:
      • 我是否必须分配 user.properties 两次,因为用户已经在注册操作中编组。无论如何,我将其添加到注册中:def registration = { if (params.user) { def user = params.user return [ user: user ] } }。但是,我现在收到 user?.profile?.firstname 的“未找到此类属性:配置文件”错误。
      • 是的,你会的。好吧,我个人习惯于render(view: 'registration', model: [user: user]),而不是redirect() - 这将避免所有参数传递。看起来userparams 中变成了字符串,所以你必须使用render()
      【解决方案3】:

      尝试显式调用错误?

      我一直在使用这种模式来重定向回相同的表单。

      if (user.save()) {
      ...
      } else {
          return error()
      }
      

      我通常在 webflows 中使用命令对象,所以我的正常模式如下所示:

      def registerFlow = {
          registerPage = {
              on("submit") { FormDataCommand cmd ->
                  cmd.validate()
                  if (cmd.hasErrors()) {
                     flow.cmd = cmd
                     return error()
                  } else {
                     ...
                  }
              }
          }
      }
      
      class FormDataCommand implements Serializable {
          User u
          Profile p
      
          static constraints = {
              u(validator: { it.validate() })
              p(validator: { it.validate() })
          }  
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-03
        • 2013-04-01
        • 1970-01-01
        • 2019-12-05
        • 2019-06-23
        相关资源
        最近更新 更多