1

谁能告诉我我做错了什么?我正在创建一个简单的系统来让人们进出用户组,为此我正在使用 Dojo 和 Perl。(如果我能以我的方式拥有它,那就是 PHP,但我不是老板。)

目前我只使用三个文件,一个用于 Perl,一个用于 JavaScript,一个用于 CSS 样式。

CGI 脚本的开头路由到不同的函数,如下所示:

if ($search = $cgi->param('psearch')) {
  dbConnect();
  jsonSearchPersons($search);
  dbDisconnect();
} elsif ($user_id = $cgi->param('person')){
  dbConnect();  
  create_form($user_id);
 dbDisconnect();
} elsif ($user_id = $cgi->param('saveuser')) {
  save_user();
} else {
  mainPage();
};
...
sub save_user {
  print $cgi->header(-type=>'text/plain',-charset=>'utf-8');
  print("success");
}

我现在遇到的问题是,当我想通过 Ajax 调用(对这个 URL 的调用:)为用户保存新组时users.cgi?saveuser=xx。这应该(在我看来)是一个 POST 调用,所以我做了这个并尝试将生成的 HTML/文本附加到 a<div>但它不起作用:

dojo.xhr.post({
  url: "/cgi-bin/users.cgi?saveuser="+user_id,
  content: {
    new_groups: group_ids.toString()
  },
  load: function(html_content){
    var element = document.getElementById("test_area");
    element.innerHTML = html_content;
  },
  error: function(){
    alert("An error has occured during the save of new user groups.");
  }
});

当我使用dojo.xhr.get();它时工作正常,但是当我使用POST时,它就像它跳过了 if 语句的那一部分并只是附加了mainPage()函数。Dojo 和 Perl 之间有什么我不理解的基本内容吗?我是否必须设置页面才能接受 POST 调用?或者我做错了什么?

注意:这是我通过 Dojo 和 Perl 制作的第一个“系统”。(我通常是一个 PHP/jQuery 类型的人,他手工制作所有 UI,所以我对它有点陌生。)

4

3 回答 3

4

尝试将 - 参数添加saveusercontent-object 中,dojo.xhrPost而不是在 url 中传递它。

您正在尝试将 saveuser 参数作为 GET 传递,另一个作为 POST 传递,这可能会使您的服务器端部分感到困惑。

试试这样:

dojo.xhr.post({
  url: "/cgi-bin/users.cgi",
  content: {
   new_groups: group_ids.toString(),
   saveuser: user_id
  },
  load: function(html_content){
    var element = document.getElementById("test_area");
    element.innerHTML = html_content;
  },
  error: function(){
    alert("An error has occured during the save of new user groups.");
  }
 });
于 2012-04-10T15:38:15.607 回答
0

CGI.pm 的第 675 行:

  # Some people want to have their cake and eat it too!
  # Uncomment this line to have the contents of the query string
  # APPENDED to the POST data.
  # $query_string .= (length($query_string) ? '&' : '') . $ENV{'QUERY_STRING'} if defined $ENV{'QUERY_STRING'};

让我笑了!

于 2012-04-11T00:24:40.003 回答
0

找到了解决方案。

问题是我的javascript。发布到 perl 脚本时,您使用 $cgi=new CGI; 以及所有这些。这需要 GET 和 POST 变量并验证它们。在我的 javascript/dojo 代码中,我使用了带有 GET 变量的 url,然后也进行了 POST。这意味着 perl 无法找出(或正在混合)这两种变量类型。因此,当我更改我的 ajax 代码(如下所示)时,它起作用了,因为 $cgi->param('saveuser') 都获取“saveuser”的 GET 和 POST(不需要更改 perl):

dojo.xhr.post({
  url: "/cgi-bin/users.cgi",
  content: {
    saveuser: user_id,
    new_groups: group_ids.toString()
  },
  load: function(html_content){
    var element = document.getElementById("test_area");
    element.innerHTML = html_content;
  },
  error: function(){
    alert("An error has occured during the save of new user groups.");
  }
});

有点古怪的错误,但我很高兴,因为它现在很好用:D

于 2012-04-12T07:26:23.620 回答