hasErrors中的错误仅出现在第二次提交中

时间:2012-10-19 22:04:19

标签: grails

我正在尝试向视图呈现一些错误,但错误仅出现在第二次提交中。

//Controller Method
def submitUserInfo = { UserDetailsCommand command ->



    if(!session.upgradeActive) {
        return upgradeProcessEnded();
    }

    User user = springSecurityService.currentUser;

    if(!user.userDetails) {

        user.userDetails = new UserDetails(params);

        user.userDetails.user = user;
    }
    else {

        user.userDetails.properties = params;
    }

    if (!command.hasErrors()) {

        if (!params.firstName)
        {
            user.userDetails.errors.rejectValue('firstName',message(code: 'base.subscription.errors.generalOutput', args: [message(code: 'base.user.firstName.label')]))
        }
        if (!params.lastName)
        {
            user.userDetails.errors.rejectValue('lastName',message(code: 'base.subscription.errors.generalOutput', args: [message(code: 'base.user.lastName.label')]))
        }

        // Internal Server Error Code
        response.status = 400
        return render (view: 'userInfo', model: [userInstance: user])
    }
    ...
}

//Class
@Validateable
class UserDetailsCommand {

    // Properties
    String firstName
    String lastName
    String phoneNumber

    //Company
    String companyName
    String companyPhoneNumber
    String address
    String postalCode
    String country
    String city
    String state

    static constraints = {
        firstName nullable: false
        lastName nullable: false
        address nullable: false
        postalCode nullable: false
        country nullable: false
        city nullable: false
        state nullable: false
        companyName nullable: false
    }
}

//View
<g:if test='${flash.message}'>
        <div class="control-group primary-background">
            <div class='alert alert-error'>
                <i class="icon-exclamation-sign"></i>
                ${flash.message}
            </div>
        </div>
        <%-- Clear messages to prevent showing on refresh --%>
        ${flash.clear()}
    </g:if>
<g:hasErrors bean="${userInstance.userDetails}">
<div class="control-group primary-background">
    <p class="alert alert-error">
        <g:each var="error" in="${userInstance.userDetails.errors.allErrors}">
            <i class="icon-exclamation-sign"></i>
            <g:message error="${error}" />
            <br />
        </g:each>
    </p>
</div>
</g:hasErrors>

<div class="flex_column one_half first">

<g:hiddenField name="id" value="${ userInstance?.id }"/>

<h3><g:message code="base.user.details.title" /></h3>   

<strong><g:message code="base.user.email.label" />: </strong>
${fieldValue(bean: userInstance, field: "username")}

<label for="firstName"><g:message code="base.user.firstName.label" /></label>
<g:textField name="firstName" value="${fieldValue(bean: userInstance.userDetails, field: "firstName")}"/>

<label for="lastName"><g:message code="base.user.lastName.label" /></label>
<g:textField name="lastName" value="${fieldValue(bean: userInstance.userDetails, field: "lastName")}"/>
...

好吧,在第一次提交中,在显示错误之后没有出现错误。 当我更改验证规则时,空白字段,案例再次重复。 如果第一次提交中的字段为空,则在第二次提交后出现没有错误。 有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您只显示if (!command.hasErrors()) {

的代码块

如果您提交空白firstNamelastName,那么 应该。

如果没有,您是否应该使用blank: false代替nullable: false作为firstNamelastName的验证器,而不是尝试自行验证?< / p>