2012-12-13 34 views
3

好吧,我有一個令人尷尬的簡單問題,希望有一個令人尷尬的簡單答案。我想獲得一個asp:ImageButton來顯示一條警告消息,其中包含來自我的代碼隱藏的變量。下面的代碼的過於簡化的版本:OnClientClick事件沒有註冊來自代碼隱藏的JavaScript警報

public string AlertMe 
{ 
    get 
    { 
     return "alert('hi');"; 
    } 
} 

現在,當我嘗試訪問這樣說:

<asp:ImageButton ID="btn" runat="server" ImageUrl="/Images/img.ico" OnClientClick='<%=AlertMe%>'/> 

我看回傳,但沒有警告消息,因爲如果它不能訪問我的財產。同時,這兩條線:

<%=AlertMe%><br /> 
<a onclick="<%=AlertMe%>">click this</a> 

都工作正常和丹迪。 (第一個顯示javascript警報的代碼,第二個警報沒有問題。)

所以我最大的問題是:爲什麼一個asp控件的OnClientClick事件無法註冊警報?是否存在我缺少的明顯缺陷,還是我真的需要從代碼隱藏註冊整個事件?

+1

我不會繼續沿着這種將您的行爲客戶端Javascript與編譯的服務器端代碼嵌入的路徑。我更喜歡在外部文件中使用不引人注目的Javascript(jQuery?),以保持邏輯上的分離。如果需要,您可以使用服務器端構造來確定要包含哪些.js文件。 –

+0

我非常欣賞這個輸入。希望這是我可以放鬆自己,因爲我更加熟悉Javascript和jQuery。 – MadHenchbot

回答

4

您不能使用<%= ... %>語法來設置服務器控件的屬性。要在服務器控件上設置動態屬性,您必須將其設置爲代碼。

this.btn.OnClientClick = this.AlertMe; 

這是因爲<%= ... %>Response.Write()一個快捷方式。所以,直到之後纔會調用 aspx已被解析,評估並且已經開始渲染。那時已經太晚了。

至於設置的代碼背後的價值選擇,你可以使用這個準陳述技術:

<asp:ImageButton ID="btn" runat="server" ImageUrl="/Images/img.ico" /> 
<% 
btn.OnClientClick = <%=AlertMe%>; 
%> 

還有其他的方法來解決它。 This answer to a similar question討論了您可以採取的幾種方法。我找不到任何專門提到這一點的「官方」參考資料(例如msdn),但我沒有那麼努力。這裏有幾個博客文章認爲討論這個問題爲好:

或者google it with bing更多有趣的閱​​讀。

+0

有沒有機會解釋這種行爲?我相信這個修復會起作用,但我真的很好奇爲什麼服務器控件會有這個限制。由於該按鈕被隱藏在ListView的SelectedItemTemplate中,所以這個問題變得複雜起來,並且真的很痛苦。 – MadHenchbot

+0

@MadHenchbot - 我添加了一些鏈接到我的答案的結尾。 – gilly3

+0

感謝您的詳細解釋! – MadHenchbot

-1

我認爲它是一個引用問題。嘗試

OnClientClick="<%=AlertMe%>" 
+0

我試過用這兩種引號,但無濟於事。當我直接輸入警報時,它可以正常工作,但控制器似乎無法處理<%= %>表示法。 – MadHenchbot