3

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

4

3 回答 3

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),但我看起来并不难。这里有几篇博客文章也讨论了这个问题:

或者用 bing 搜索它以获得更多有趣的阅读。

于 2012-12-13T00:25:44.393 回答
1

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

我发现关于 Expression Builders 和 ViewState 问题的部分内容特别丰富。

于 2012-12-13T15:40:14.267 回答
-1

我认为这是一个引用问题。尝试

OnClientClick="<%=AlertMe%>"
于 2012-12-13T00:27:05.870 回答