1

问候!

我现在遇到了一些我在使用 Data::FormValidator 时遇到的问题。我将从我目前正在使用的代码开始;这是我用来生成表单的模板文件:

    <form method="post" target="/">
            text[] <input type="text" name="text[]" /><br />
            text[] <input type="text" name="text[]" /><br />
            text[] <input type="text" name="text[]" /><br />
            text[] <input type="text" name="text[]" /><br />
            <br />
            abc <input type="radio" name="abc" value="1" /><br />
            abc <input type="radio" name="abc" value="2" /><br />
            abc <input type="radio" name="abc" value="3" /><br />
            abc <input type="radio" name="abc" value="4" /><br />
            abc <input type="radio" name="abc" value="5" /><br />
            <br />
            herp <input type="checkbox" name="herp" value="abc"><br />
            dee <input type="checkbox" name="dee" value="dd"><br />
            derp <input type="checkbox" name="derp" value="beri"><br />
            <br />

            <input type="submit" value="Submit!!!!" name="submit" /><br />
    </form>

这是我用来测试数组验证问题的当前代码:

    #!/usr/bin/env perl

    use Carp;
    use Data::Dumper;
    use Template;
    use Data::FormValidator;
    use Data::FormValidator::Constraints qw(:closures);
    use Dancer;

    set logger => "file";
    setting log_path => "./";

    get '/' => sub {
            template 'index.tt';
    };

    post '/' => sub {
            my $self = shift;
            my $par = params;
            print Dumper($par);
            my $profile = {
                    required => [ qw( text[] ) ],
                    optional => [ qw( abc herp dee derp ) ],
                    constraint_methods => {
                            'text[]' => sub {
                                    my $self = shift;
                                    my $val = shift;
                                    print "Hello world. I'm validating text[], value = $val\n";
                                    my $ret;
                                    if($val =~ /^a/i) {
                                            $ret = 1;
                                    } else {
                                            $ret = 0;
                                    }
                                    print "And I got: $ret\n";
                                    return $ret;
                            },
                    },
            };
            print Dumper(Data::FormValidator->check($par,$profile));
            return;
    };




    dance;

我得到的输出显示 text[] 完全无效,这是可以理解的;我想弄清楚是否有任何方法可以将数组作为一个整体进行约束,并且只删除不匹配的元素?我假设使用过滤器可能是可行的,但我想确保我不只是愚蠢。任何帮助,将不胜感激。

4

1 回答 1

0

根据您如何解析和呈现给您的参数,text[]确实可能“完全无效”。我自己不会将 HTML 表单字段命名为“文本”,只是为了避免与保留字的潜在交互,并减轻混淆。

话虽如此,我只是将字段称为“文本”而不​​是“文本 []”,并依靠您的参数解析器将 $text 或其等效项呈现为值数组。然后在您的约束方法中迭代它们。

将有几个陷阱,具体取决于您使用的参数解析器。例如,如果提交了多个值,CGI.pm 将在数组中呈现多变量字段,但如果只提交一个值,则将相同的字段呈现为标量。

于 2012-08-22T15:48:11.410 回答