2

我正在验证 Play 框架(java)中的表单,它在提交后将逗号添加到我的表单值中。

这是表格:

#{form @doCreate()}
    <input type="text" name="session.sessionName" value="${flash['session.sessionName']}"/>
    <input type="text" name="session.jumpDate"value="${flash['session.jumpDate']}"/>
    <select id="jumpers" multiple="multiple" name="jumpers[]" title="Click to Select a Jumper">
        ..several options here
   </select>
#{/form}

这是表单处理程序:

public static void doCreate(JumpSession session, String[] jumpers) {

    validation.required(session.getSessionName()).message("sessionName.required");
    validation.required(session.getJumpDate()).message("jumpDate.required");
    validation.required(jumpers).message("jumpers.required");


    if (validation.hasErrors()) {
        params.flash(); // add http parameters to the flash scope
        validation.keep(); // keep the errors for the next request
        create();
    }

    render();
}

该方法create()呈现刚刚显示的相同表单:

public static void create() {
    boolean isAuthorized = Security.isConnected();
    // Get the user details
    String userid = Security.connected();

    render(isAuthorized, userid);
}

验证一切正常,除了每个字段中的值在验证后在末尾添加了一个“,”字符。如果我提交一个完全空白的表单,它会在每个字段中返回一个逗号 (',') 字符。如果我只在一个字段中输入一个值,则该值返回时会在末尾粘贴一个逗号。更重要的是,如果我再次提交,对于之前的每个逗号,现在还有 2 个逗号!

编辑:我也尝试过使用${flash['session.jumpTime']?:""} 来确保实际定义了变量。

编辑:它发生在 params.flash() 方法中。 System.out.println(params.allSimple())显示没有逗号,但在 params.flash() 之后存储在 flash 中的值,如 System.out.println(flash) 所示,显示逗号。当我手动将值添加到闪存时,逗号永远不会出现。

for (Map.Entry<String, String> entry : temp.entrySet())
        {
            flash.put(entry.getKey(), entry.getValue());
        }

这个 hack 解决了我的问题,但我仍然想知道为什么我不能只使用 params.flash()。

4

1 回答 1

1

我发现了这个问题,毕竟它与 Play 无关。我正在使用的一个 javascript 库(jQuery 工具)在我不知情的情况下克隆了页面上的元素,从而创建了双重表单提交。由于每个表单元素都加倍,因此这些值用逗号分隔。这在 params 变量中是无法检测到的,因为它只在 .flash() 方法中插入了逗号。

普肖。

于 2011-10-28T17:30:16.810 回答