2011-10-20 116 views
3

我試圖做一些似乎相當簡單的事情。我有一個用戶控制幾個LinkButtons。每個LinkButtonOnCommandCommandNameCommandArgument集,像這樣:LinkBut​​ton OnCommand或OnClick沒有觸發

<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以某種方式參與了該問題。我仍然在撓我的腦海,雖然...

+0

你發佈了所有有問題的代碼還是你減少了它?如果減少,你確定這個代碼仍然重現了這個問題嗎?請嘗試FireBug>控制檯窗口以查看是否正在生成GET/POST請求。 –

+0

這實質上就是我所擁有的代碼。 ChooseRegion()與我的代碼完全相同,並且HTML/ASP.NET前端代碼沒有太多其他內容。我做了檢查,並且看到POST請求,正如我所期望的那樣。 –

回答

2

啊哈!在仔細思考了我上面添加的信息之後,我發現問題在於我的開發環境和生產機器之間的區別在於生產機器安裝了ISAPI_Rewrite並且有一整套重寫規則沒有。

其中一個將/default.aspx的請求重寫爲/ ...所以當我點擊LinkBut​​ton時,服務器攔截了POST請求併發出301重定向到/,然後瀏覽器抓取/ GET請求 - 所以POST有效負載從未將其發送到我的ASP.NET代碼。

添加RewriteCond METHOD GET以解決問題的規則。

現在我可以讓我的頭髮再次長出來!

1

爲什麼不添加一些錯誤記錄功能,將錯誤發送到文本文件? 然後你可以手動檢查服務器上的代碼是否會引發任何錯誤?我無法找到您的代碼中的任何錯誤,但一些更多的經驗可能..然而,我使用這樣的時間記錄錯誤的方法超過其他時間..

+0

謝謝 - 這是一個很好的建議。我確實嘗試過,並沒有看到任何異常記錄在這一點上。 –

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 
    } 
    } 
+0

我試着改變上面列出的代碼。由此產生的代碼仍然無法正常工作,LinkBut​​ton_Click函數無法被調用。 –

+1

此外 - 我有點困惑 - 我已經使用OnCommand + CommandName + CommandArgument沒有OnClick處理程序在幾個實例之前沒有問題,並且由OnCommand指定的函數被調用。我認爲這就是我應該這樣做的,但它只能與OnClick一起使用嗎? –

相關問題