好吧,我有一个令人尴尬的简单问题,希望有一个令人尴尬的简单答案。我试图得到一个asp:ImageButton来显示一个包含我的代码隐藏变量的警报消息。这是代码的过度简化版本:
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事件无法注册警报?是否存在一个明显的缺陷,或者我是否真的需要从代码隐藏中注册整个事件?
答案 0 :(得分:4)
您无法使用<%= ... %>
语法设置服务器控件的属性。要在服务器控件上设置动态属性,必须在代码中设置它。
this.btn.OnClientClick = this.AlertMe;
这是因为<%= ... %>
是Response.Write()
的快捷方式。因此,在之后解析,评估并开始渲染时,才会调用它。到那时为时已晚。
作为在代码中设置值的替代方法,您可以使用这种准声明性技术:
<asp:ImageButton ID="btn" runat="server" ImageUrl="/Images/img.ico" />
<%
btn.OnClientClick = <%=AlertMe%>;
%>
还有其他方法可以解决这个问题。 This answer to a similar question讨论了您可以采取的几种方法。我找不到任何具体提到这个的“官方”参考文献(例如,msdn),但我看起来并不那么难。以下是一些讨论该问题的博客文章:
或google it with bing以获得更有趣的阅读。
答案 1 :(得分:1)
对于遇到此问题的其他人,我在以下情况中遇到过这个博客: http://weblogs.asp.net/infinitiesloop/archive/2006/08/09/The-CodeExpressionBuilder.aspx
我发现有关Expression Builders和ViewState问题的部分特别有用。
答案 2 :(得分:-1)
我认为这是一个引用问题。尝试
OnClientClick="<%=AlertMe%>"