CGI ::应用程序,隐藏的表单值被覆盖

时间:2014-03-27 21:57:09

标签: perl cgi

我正在浏览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,所以我不知道发生了什么或如何解决这个问题。

2 个答案:

答案 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