我正在尝试做一些看似相当简单的事情。我有一个包含多个LinkButtons
的用户控件。每个LinkButton
设置OnCommand
,CommandName
和CommandArgument
,如下所示:
<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
。我尝试在EnableViewState="true"
上设置LinkButtons
。到目前为止,我没有尝试过任何工作。
但是,这在我的开发机器(Windows 7)上运行良好。
我觉得在这一点上相当确定导致这种情况的两个环境之间可能存在一些配置差异,但我真的不确定从哪里开始查找。想法?
编辑 - 2011-10-26:
好的 - 我发现我在其他地方也遇到过这个问题。具有上述代码的网站和我遇到问题的其他网站都是Sitecore解决方案,共享相同的Sitecore实例。
在另一个网站上,有一个电子邮件地址的文本框和一个带有OnClick事件的关联ImageButton。这一切都在一个控件中,该控件包含在网站的每个页面上。在主页上,OnClick处理程序永远不会触发。在任何其他页面上,OnClick处理程序都会触发。
上面帖子原始部分的代码也在网站的主页上。如果我将其移动到任何其他页面,它将按预期工作。
此外,与我帖子原始部分中的代码一样,它在我的开发机器(Windows 7)上运行良好,但在生产机器(Windows 2008 Server)上运行不正常。所以,似乎这似乎与在主页上有关,也许Sitecore以某种方式参与了这个问题。我仍在挠头,但是......
答案 0 :(得分:2)
啊哈!在仔细考虑了上面添加的一些信息之后,我意识到问题是什么,在弄清楚我的开发环境和生产机器之间的区别在于生产机器安装了ISAPI_Rewrite并且我还有一大堆重写规则没有。
其中一个将对/default.aspx的请求重写为/ ...所以当我点击LinkButton时,服务器截获POST请求并发出301重定向到/,然后浏览器获取/使用GET请求 - 所以POST有效负载从未进入我的ASP.NET代码。
将RewriteCond METHOD GET
添加到相关规则中解决了问题。
现在我可以让我的头发再次长出来了!
答案 1 :(得分:1)
为什么不添加一些错误记录功能,将错误发送到文本文件? 那么你可以手动检查服务器上你使用的代码是否会抛出任何错误?我不能在你的代码中发现任何错误,但是一些更多的经验可能......但是我使用记录错误的方法比其他时间更多...
答案 2 :(得分: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
}
}