【问题标题】:Why aren't my Play! validation errors displayed?为什么不是我的Play!显示验证错误?
【发布时间】:2011-11-17 16:07:32
【问题描述】:

我正在尝试关注 Play! 的 documentation for validation。我有一个具有 3 个动作的控制器:

  1. add() - “添加网站”表单
  2. added() - 在提交添加表单时调用,执行实际添加。
  3. edit() - 成功的 added() 调用会导致编辑添加的网站(失败的添加会导致返回 add() 表单)。

当验证失败时,我会按计划重定向到 add() 操作。 #{ifErrors} 模板有效(显示<h1>Oops…</h1>)...但是有两个问题:

  1. 网站 URL 参数没有“闪烁” - 在添加表单中,它没有出现在相应的字段中。
  2. 不出现特定错误 - 此字段保持空白:<span class="error">#{error 'website.url' /}</span>

我错过了什么?

我的控制者:

public class Sites extends Controller {
    private static final WebsiteRepository websiteRepo = new WebsiteRepository();

    public static void add() {
        render();
    }

    public static void added(@Valid Website website) {
        if (Validation.hasErrors()) {
            Validation.keep();
            params.flash();
            add();
        }

        websiteRepo.save(website);
        edit(website.id);
    }

    public static void edit(long websiteId) {
        Website website = websiteRepo.getById(websiteId);
        render(website);
    }

}

add.html

<div id="addsite">

    <h1>Add a new site</h1>

    #{ifErrors}
   <h1>Oops…</h1>
    #{/ifErrors}

    #{form @added()}

        #{if flash.error}
            <p class="error">
                &{flash.error}
            </p>
        #{/if}
        #{if flash.success}
            <p class="success">
                &{flash.success}
            </p>
        #{/if}


        <p id="url-field">
            <label for="url">URL</label>
            <input type="text" name="website.url" id="url" class="url-field" value="${flash.url}" />
            <span class="error">#{error 'website.url' /}</span>
        </p>

        <p id="add-field">
            <input type="submit" id="add" value="Add" />
        </p>
    #{/form}
</div>

【问题讨论】:

  • 你能用#{errors} &lt;li&gt;${error}&lt;/li&gt; #{/errors}打印出错误吗?
  • 并使用@Required 注释了您的模型?

标签: java validation playframework


【解决方案1】:

值格式错误,复杂对象使用:

${flash['website.url']}

编辑:我克隆了你的仓库,你有以下错误:

  • 在您的模板中将 ${flash[website.url]} 替换为 ${flash['website.url']}
  • 您将 URL 标记为 @Required,但未标记为 @URL;添加@URL注解,报错会显示“Not a valid URL”
  • 需要所有者,但无法提供所有者,因此总会出现验证错误

【讨论】:

  • 有意义......但是,当视图按照您的建议呈现时,我收到“无法在空对象上获取属性 'url'”。如果我尝试实例化一个新的空网站对象,并将其在网站本地变量中传递给add()render() 方法,我会得到一个不同的异常:play.lighthouseapp.com/projects/57987-play-framework/tickets/…
  • 我用你的代码构建了一个项目,它对我有用。也许您的路线或模型有​​问题。请同时发布这两个。
  • 转载。请克隆这个 git repo:github.com/ripper234/PlayFramework-bug-report--1262- 然后运行 ​​play 并访问 localhost:9000/Application/add
  • 非常感谢您的努力!我已经解决了您答案中的其他两个项目符号,但第一个项目符号我没有解决。
【解决方案2】:

而不是调用 add() 尝试:

 render("Sites/add.html", website);

其中第一项是 Add 模板的路径,第二项是您在 POST 调用中获得的表单参数。

第一个参数也可以引用为“@add”(快捷方式)

【讨论】:

  • 这似乎没有任何改变。
猜你喜欢
  • 2019-12-31
  • 2012-12-30
  • 2012-04-03
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2020-04-16
相关资源
最近更新 更多