Forms 使用Data::FormValidator验证HTML表单数组
敬礼 我带着一个我目前在使用Data::FormValidator时遇到的问题来到这里。我将从我目前使用的代码开始;这是我用来生成表单的模板文件:Forms 使用Data::FormValidator验证HTML表单数组,forms,perl,web-applications,validation,Forms,Perl,Web Applications,Validation,敬礼 我带着一个我目前在使用Data::FormValidator时遇到的问题来到这里。我将从我目前使用的代码开始;这是我用来生成表单的模板文件: <form method="post" target="/"> text[] <input type="text" name="text[]" /><br /> text[] <input type="text" name="text[]" />&
<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>
我得到的输出显示文本[]完全无效,这是可以理解的;我想弄明白的是,有没有办法将数组作为一个整体进行约束,只删除不匹配的元素?我认为使用过滤器可能是可行的,但我想确保我不只是傻。任何帮助都将不胜感激。根据您的参数解析和呈现方式,
text[]
确实可能“完全无效”。我本人不会将HTML表单字段命名为“文本”,只是为了避免与保留字的潜在交互,并减轻混淆
也就是说,我将只调用字段“text”而不是“text[]”,并依靠您的param解析器将$text或其等价物表示为一个值数组。然后在约束方法中迭代它们
根据您使用的param解析器,将有两个gotchas。例如,如果提交了多个值,则CGI.pm将在数组中显示多变量字段,但如果仅提交了一个值,则将显示与标量相同的字段
#!/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;