OnClientClick事件不会从代码隐藏中注册javascript警报

时间:2012-12-13 00:21:22

标签: c# javascript asp.net

好吧,我有一个令人尴尬的简单问题,希望有一个令人尴尬的简单答案。我试图得到一个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事件无法注册警报?是否存在一个明显的缺陷,或者我是否真的需要从代码隐藏中注册整个事件?

3 个答案:

答案 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%>"