我正在浏览CGI::Application的基本示例,但是当我尝试添加第3种模式时,似乎查询对象拒绝使用我提供的值。
webapp.cgi :
#!/usr/bin/perl
use webapp;
my $webapp = WebApp->new();
$webapp->run();
webapp.pm:
package WebApp;
use base 'CGI::Application';
sub setup {
my $self = shift;
$self->start_mode('mode1');
$self->mode_param('rm');
$self->run_modes(
'mode1' => 'do_stuff',
'mode2' => 'do_more_stuff',
'mode3' => 'do_something_else'
);
}
sub do_stuff {
my $self = shift;
my $q = $self->query();
my $output = '';
$output .= $q->start_html(-title => 'Widget Search Form');
$output .= $q->start_form();
$output .= $q->textfield(-name => 'widgetcode');
$output .= $q->hidden(-name => 'rm', -value => 'mode2');
$output .= $q->submit();
$output .= $q->end_form();
$output .= $q->end_html();
return $output;
}
sub do_more_stuff {
my $self = shift;
my $q = $self->query();
my $widgetcode = $q->param("widgetcode");
my $output = '';
$output .= $q->start_html(-title => 'List of Matching Widgets');
$output .= $q->start_form();
$output .= $q->textfield(-name => 'widgetcode');
$output .= $q->hidden(-name => 'rm', -value => 'mode3');
# ^^^^^^
# this value is being ignored
$output .= $q->submit();
$output .= $q->end_form();
$output .= $q->end_html();
return $output;
}
sub do_something_else {
my $self = shift;
my $q = $self->query();
my $widgetcode = $q->param("widgetcode");
my $output = '';
$output .= $q->start_html(-title => 'Widgets details');
$output .= $q->start_form();
$output .= $q->textfield(-name => 'widgetcode');
$output .= $q->hidden(-name => 'rm', -value => 'mode4');
$output .= $q->submit();
$output .= $q->end_form();
$output .= $q->end_html();
return $output;
}
1;
所以它可以正常加载第一页(mode1),它给我表单,我可以提交它并到达第二页(mode2),但我无法达到mode3,因为rm
参数正在设置为“mode2”,尽管如上所述,我将其设置为“mode3”。这意味着我又被送回了mode2。我可以将rm
更改为rm2
或其他内容,然后选择正确的值,但显然这没有帮助,因为rm
变量用于设置模式。
我没有使用CGI.pm
(提供query
对象)的经验,正如您所知,我只是刚刚开始学习CGI :: Application,所以我不知道发生了什么或如何解决这个问题。
答案 0 :(得分:2)
似乎perlmonks有智慧:Hidden fields using CGI
您可以使用-override参数强制它使用默认值。
在我的情况下将使用如下:
$output .= $q->hidden(-name => 'rm', -value => 'mode3' , -override => 1);
希望能帮助那些通过搜索找到这个问题的人,因为这根本不是显而易见的。
答案 1 :(得分:0)
是的,似乎hidden
方法将使用当前表单值(如果存在)而不是您指定的默认值。使用?rm=mode2
访问视图时,可以使用以下代码观察到这一点:
$output .= $q->hidden(-name => 'rm', -value => 'mode3'); # Prints mode2
$q->param('rm' => 'mode3');
$output .= $q->hidden(-name => 'rm'); # Print mode3
如您所见,最佳解决方案是使用CGI #Form Elements
$output .= $q->hidden(-name => 'rm', -value => 'mode3', -override => 1); # Print mode3