validation - 在Grails中更改控制组的Twitter Bootstrap验证状态

标签 validation twitter-bootstrap grails

所以我有一个带有表单的gsp,并且在验证表单字段时尝试使用Twitter验证状态。我正在使用grails命令对象进行验证。问题是,如果命令对象中的字段使用“$ {hasErrors(bean:validationCommand,field:'start','error')}“错误,则grails提供了一种将“错误”类添加到控制组的方法。 。如果字段“开始”中包含验证错误,则会添加错误标签。在某种程度上,这可以正常工作。因此,开始字段在验证错误时变为红色。但是我也希望它也能在验证成功时变绿!这没有发生。

因此,这是开始表单字段:

 <div 
class="control-group ${hasErrors(bean:validationCommand, field:'start', 'error')}">
                    <label class="control-label" for="start">Starting Tag</label>
                    <div class="controls">
                        <g:textField name="start"
                            value="${fieldValue(bean:validationCommand,field:'start')}"
                            class="input-medium " />
                        <g:hasErrors bean="${validationCommand}" field="start">
                            <ul>
                                <span class="help-inline"> <g:renderErrors
                                        bean="${validationCommand}" field="start" as="list" />
                                </span>
                            </ul>
                        </g:hasErrors>
                    </div>
                </div>

我可以想到的一种方法是使用测试来检查字段是否有错误,然后将变量(例如startState)设置为成功还是错误,然后在div中使用$ {startState}类。
<g:if test="${ hasErrors(bean:validationCommand, field:'start') }">
                    <g:set var="startState" value="error"/>
                </g:if>
                <g:else>
                    <g:set var="startState" value="success"/>
                </g:else>
                </g:if>
                <div
                    class="control-group ${startState}">
                    <--same gsp as above-->

这是因为该字段从一开始就为绿色(即使在文本字段中未输入任何内容),然后在出现错误时变为红色,或保持绿色。

我进行此工作的最后一次尝试涉及另一个if测试,以查看是否使用
<g:if test="${fieldValue(bean:validationCommand,field:'start') != null }">

这不会影响第二次尝试的结果。

所以问题是,我如何基于输入字段的验证将成功类动态添加到div标签。

编辑:

Controller 如下所示:
class ValidationController {

def index() {
}

def validate(ValidationCommand cmd) {
    if (cmd.hasErrors()) {
        render view: 'index', model: [validationCommand: cmd]
    } else {
        try {
            SourceLocation repo = SourceLocation.findById(cmd.repo)
            def parentJira = cmd.issueService.findIssue(cmd.jira)

            Collection<IssueViewModel> issues = cmd.issueService.listIssuesForParent(cmd.jira)
            Collection<SourceCommitViewModel> commits = cmd.sourceRepositoryService.listCommits(repo.project, repo.slug, cmd.start, cmd.end)

            def (valid, missing_linked_issues, missing_mentioned_issues, bad_commits, issues_with_filtered_commits) = cmd.validationService.validate(repo, issues, commits)
            [ParentJira: parentJira, Valid: valid, Commits: commits, Issues: issues, LinkedMissing: missing_linked_issues, MentionedMissing: missing_mentioned_issues, BadCommits: bad_commits, SourceCommitValidation: issues_with_filtered_commits]
        } catch (e) {
            log.error( "Validation Controller Error", e )
            flash.message = "validation.service.failed"
            flash.args = [e.message]
            flash.default = "Validation Service failed"
            redirect action: 'index', params: params
        }
    }
}
}

命令对象是:
class ValidationCommand {

def validationService
def sourceRepositoryService
def issueService

String jira
String repo
String start
String end

static constraints = {
    jira blank: false, nullable: false, matches: "[a-zA-Z]+-[0-9]+", validator: existsIssueAndIsARelease
    repo blank: false, nullable: false, validator: { val, obj -> SourceLocation.findById(val) != null }
    start blank: false, nullable: false, validator: existsTag
    end blank: false, nullable: false, validator: existsTag
}
}

最佳答案

您可以在这里查看:Grails hasErrors method with ternary operator?,但是不久之后,hasErrors(bean:validationCommand,field:'start')的行为不符合您的预期(意味着-它不返回 bool(boolean) 值)。它旨在用于CSS类表达式中。因此,在您的情况下,我将为此创建一个标签,或者也有一个快速的解决方法(这种方法看起来很难看,所以我并不推荐这样做): <g:if test="${ hasErrors(bean:validationCommand, field:'start', 'true') } == 'true'"> <g:set var="startState" value="error"/> </g:if> <g:else> <g:set var="startState" value="success"/> </g:else> <div class="control-group ${startState}">

关于validation - 在Grails中更改控制组的Twitter Bootstrap验证状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19323652/

相关文章:

spring - 从BindingResult中的ObjectError中获取FieldErrors

perl - 哪些 Perl 模块可用于验证子例程参数?

json - grails NullPointerException 保存双向一对多关系模型

ios - 如何在grails代码中获取设备(ipad)的方向

plugins - 如何在 Grails 插件中使用 I18N 消息

三层架构中的验证

java - Bean 验证 : How to localize messages programmatically?

google-chrome - Grails/Chrome 错误 : resource interpreted as Font but transferred with MIME type application/octet-stream

javascript - 如何通过 bootstrap-sass gem 实现 boostrap 模板

css - bootstrap popover z-index 的问题