LinkButton的OnCommand或OnClick事件未触发

3

我想做一些看起来非常简单的事情。我有一个用户控件,其中包含几个 LinkButton。每个 LinkButton 都设置了 OnCommandCommandNameCommandArgument,如下所示:

<ul id="continents">
    <li id="northamerica"><asp:LinkButton ID="lbNorthAmerica" OnCommand="ChooseRegion" CommandName="SetCookie" CommandArgument="North America" runat="server">North America</asp:LinkButton></li>
    <li id="southamerica"><asp:LinkButton ID="lbSouthAmerica" OnCommand="ChooseRegion" CommandName="SetCookie" CommandArgument="South America" runat="server">South America</asp:LinkButton></li>
    <li id="asia"><asp:LinkButton ID="lbAsia" OnCommand="ChooseRegion" CommandName="SetCookie" CommandArgument="Asia" runat="server">Asia</asp:LinkButton></li>
    <li id="australia"><asp:LinkButton ID="Australia" OnCommand="ChooseRegion" CommandName="SetCookie" CommandArgument="Australia" runat="server">Australia</asp:LinkButton></li>
    <li id="africa"><asp:LinkButton ID="lbAfrica" OnCommand="ChooseRegion" CommandName="SetCookie" CommandArgument="Africa" runat="server">Africa</asp:LinkButton></li>
    <li id="europe"><asp:LinkButton ID="lbEurope" OnCommand="ChooseRegion" CommandName="SetCookie" CommandArgument="Europe" runat="server">Europe</asp:LinkButton></li>
</ul>

就代码而言,用户控件具有 AutoEventWireup="true"

在代码后台,我有以下内容:

    protected void ChooseRegion(object sender, CommandEventArgs e)
    {
        Response.Cookies["region"].Value = e.CommandArgument.ToString();
        Response.Cookies["region"].Expires = DateTime.Now.AddDays(90);
        SendToRegion(e.CommandArgument.ToString());
    }

在我的生产环境(Windows Server 2008)中,当我点击链接按钮时,ChooseRegion()没有被调用,因此没有设置cookie。我不知道如何解决这个问题。我尝试手动在OnInit中配置命令处理程序,并尝试使用OnClick代替OnCommand。我尝试在LinkButtons上设置EnableViewState="true",但迄今为止尝试的所有方法都没有奏效。
然而,在我的开发机器(Windows 7)上可以正常工作。
目前,我相当确信两个环境之间存在某些配置差异导致了这个问题,但我真的不知道从哪里开始寻找。有任何想法吗?
编辑 - 2011-10-26:
好的-我发现我也在其他地方遇到了这个问题。具有上述代码的网站和我遇到问题的另一个网站都是Sitecore解决方案,共享相同的Sitecore实例。
在另一个网站上,有一个文本框用于输入电子邮件地址,以及一个带有OnClick事件的相关ImageButton。这都在一个控件中,该控件包含在网站的每个页面中。在主页上,OnClick处理程序从来没有触发过。在其他任何页面上,OnClick处理程序都会触发。
我的帖子原始部分中的代码也在网站的主页上。如果将其移动到任何其他页面,则会按预期工作。
而且,就像我帖子原始部分中的代码一样,在我的开发机器(Windows 7)上正常工作,但在生产机器(Windows 2008 Server)上不行。因此,这似乎与在主页上有关,也许Sitecore在问题中扮演了一定的角色。尽管如此,我仍然感到困惑...

你是否已经发布了所有问题的代码,或者将其缩减了?如果缩减了,你是否确保此代码仍然能够重现该问题?请尝试使用 FireBug > 控制台窗口,查看是否生成了 GET/POST 请求。 - P.Brian.Mackey
这本质上就是我所拥有的代码。ChooseRegion() 就和我的代码一模一样,HTML/ASP.NET 前端代码也没有太多其他的东西。我已经检查过了,看到的是像我预期的那样的 POST 请求。 - Jeremy Clifton
3个回答

2

哎呀!在仔细思考我上面添加的那一点信息之后,我意识到问题所在了。我发现我的开发环境和生产机器之间的区别是:生产机器安装了ISAPI_Rewrite和一堆重写规则,而我没有。

其中一个规则将请求重写为 /default.aspx 到 /... 所以当我点击 LinkButton 时,服务器拦截了 POST 请求并发出了 301 重定向到 /,然后浏览器使用 GET 请求获取 /——因此 POST 负载从未传递到我的 ASP.NET 代码中。

在相关规则中添加 RewriteCond METHOD GET 可以解决这个问题。

现在我可以让头发再次生长了!


1

所有的链接按钮都应该有以下的 OnClick 处理程序:

<asp:LinkButton ID="lbAsia" OnClick="LinkButton_Click" OnCommand="ChooseRegion" CommandName="SetCookie" CommandArgument="Asia" runat="server">Asia</asp:LinkButton>

然后在代码后台你可以这样做:

  protected void LinkButton_Click(Object sender, EventArgs e) 
  {
     string commandArgument = (sender as LinkButton).CommandArgument;
     string commandName =(sender as LinkButton).CommandName;

    if(commandName == "something")
    {
        //Do something
       //and so on
    }
  }

1
我尝试按照您上面概述的更改代码。生成的代码仍然无法正常工作,LinkButton_Click函数从未被调用。 - Jeremy Clifton
2
另外,我有点困惑——我以前在几个实例中使用了OnCommand + CommandName + CommandArgument而没有OnClick处理程序,而指定的OnCommand函数会被调用。我认为这就是我应该做的,但它只能与OnClick一起使用吗? - Jeremy Clifton

1
为什么不添加一些错误日志功能,将错误发送到一个文本文件中呢?这样你就可以手动检查服务器上的代码是否会抛出任何错误了。我无法通过肉眼找到你代码中的任何错误,但是其他有经验的人可能会发现一些问题。在这种情况下,我通常会使用记录错误的方法来解决问题。

谢谢 - 这是一个好建议。我尝试过了,但目前没有看到任何异常被记录。 - Jeremy Clifton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接