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



好吧,我有一个简单得令人尴尬的问题,希望它能得到简单得令人难堪的答案。我正试图获得一个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事件无法注册警报?我是否遗漏了一个明显的缺陷,或者我真的需要从代码后面注册整个事件?

不能使用<%= ... %>语法设置服务器控件的属性。若要在服务器控件上设置动态属性,必须在代码中进行设置。

this.btn.OnClientClick = this.AlertMe;

这是因为<%= ... %>Response.Write()的快捷方式。因此,在解析、评估aspx并开始渲染之后,才会调用它。到那时已经太晚了。

作为在代码后面设置值的替代方案,您可以使用这种准声明性技术:

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

还有其他方法可以解决这个问题。这个类似问题的答案讨论了你可以采取的几种方法。我找不到任何具体提到这一点的"官方"参考资料(例如,msdn),但我并没有那么认真。以下是一些讨论这个问题的博客文章:

  • Jim Black的博客文章:服务器标签不能包含<%…%>构造
  • weblogs.asp.net上的博客文章:使用ExpressionBuilder避免"服务器标记不能包含<%…%>构造">

或者用bing在谷歌上搜索,以获得更多有趣的阅读。

对于其他遇到这个问题的人,我在很久以前就看到过这个博客,当时:http://weblogs.asp.net/infinitiesloop/archive/2006/08/09/The-CodeExpressionBuilder.aspx

我发现有关Expression Builders和ViewState关注点的部分内容特别丰富。

我认为这是一个报价问题。尝试

OnClientClick="<%=AlertMe%>"

最新更新