1

我有一个自定义控件 (ascx),它实现了 IPostBackEventHandler 接口,用于拦截由自定义呈现的 HTML 链接触发的自定义事件。

在此控件中,我使用更新面板,在更新面板中,我使用文本控件,在其中呈现自定义 HTML 链接。

当我在文字控件中呈现 HTML 链接时,我使用带有以下代码的 StringBuilder:

sb.AppendFormat ("<a href=\"{0}\" id=\"custom_iterator_id\">Text</a>",
    this.Page.ClientScript.GetPostBackClientHyperlink(this, custom_string_param));

超链接可以很好地呈现,当点击它们时会触发异步回发并触发部分更新(因为所有链接都在更新面板中呈现)。

问题是我需要在触发使用上述代码呈现的 __doPostBack 之前执行一些自定义 Javascript。所以这里是修改后的代码的简化版本:

sb.AppendFormat ("<a href=\"javascript:JSFunc{0}\" id=\"custom_iterator_id\">Text</a>",
    custom_string_param);

同样在 ascx 标记中,我使用以下代码(在更新面板内部或外部):

<script language="javascript" type="text/javascript">
function JSFunc(param) {
// custom js code here .... 
__doPostBack('<%=this.ClientID%>', param);
}
</script>

这里的问题是,当单击链接时,它会执行完整的回发,而不是部分回发。我还测试了上述代码的更简单版本,似乎如果您从 href 中删除 __doPostBack 或从链接(标签)中删除 onclick 事件并将其移动到自定义 js 函数,然后您将其提供给链接,a触发完整的回发。

请注意,页面上没有错误,并且在这两种情况下代码都可以正常工作。页面根据从 __doPostBack 返回的参数正确呈现,但在第二种情况下,触发的是完整而不是部分回发。

有任何想法吗?

提前致谢,

乔治

4

1 回答 1

0

我认为你不能用ClientID. 它实际上使用UniqueIDWithDollars.NET,但通常与 ASP.NET Web 窗体一起使用,我说:你不想知道.

由于调用此方法是为了抽象出回发工作的细节,因此最好向框架询问代码。幸运的是,有一种特殊的方法可以处理细节。在您的代码中,它看起来像这样:

<script language="javascript" type="text/javascript">
    function JSFunc(param) {
        // custom js code here .... 
        <%= Page.ClientScript.GetPostBackEventReference(this, custom_string_param) %>
    }
</script>

this这让客户端脚本管理器使用对您的用户控件 ( ) 和任何自定义事件参数 ( )的引用来创建一段 JavaScript 代码custom_string_param

不过有一个警告。以这种方式调用它时,它将添加javascript:到字符串的开头。

要覆盖此行为,您需要使用GetPostBackEventReference接受 的实例PostBackOptions作为其第一个参数的重载,该实例的RequiresJavaScriptProtocol属性设置为 false。

PostBackOptions options = new PostBackOptions(this, custom_string_param)
options.RequiresJavaScriptProtocol = false;
Page.ClientScript.GetPostBackEventReference(options)
于 2011-12-11T13:52:40.127 回答