我有一个自定义控件(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函数,而该函数依次提供给链接,完全回发被触发。
请注意,页面上没有错误,在这两种情况下代码都能正常工作。页面正确呈现,具体取决于__doPostBack返回的参数,但在第二种情况下,将触发完整而非部分回发。
有什么想法吗?
提前致谢,
乔治
答案 0 :(得分:0)
我认为你不能用ClientID
调用__doPostBack。它实际上使用UniqueIDWithDollars
,但通常使用ASP.NET Web Forms我说:你不想知道。
由于调用此方法完全是为了抽象回发的工作方式的细节,因此最好向框架询问代码。幸运的是,有一种特殊的方法,它将负责细节。在你的代码中它看起来像这样:
<script language="javascript" type="text/javascript">
function JSFunc(param) {
// custom js code here ....
<%= Page.ClientScript.GetPostBackEventReference(this, custom_string_param) %>
}
</script>
这是让客户端脚本管理器使用对用户控件(this
)的引用和任何自定义事件参数(custom_string_param
)来创建JavaScript代码。
但有一点需要注意。以这种方式调用它时,它会将javascript:
添加到字符串的开头。
要覆盖此行为,您需要使用GetPostBackEventReference
的重载,该重载接受PostBackOptions
的实例作为其第一个参数,该实例将其RequiresJavaScriptProtocol
属性设置为false。 / p>
PostBackOptions options = new PostBackOptions(this, custom_string_param)
options.RequiresJavaScriptProtocol = false;
Page.ClientScript.GetPostBackEventReference(options)