href之外的__doPostBack会导致整页回发

时间:2011-10-31 09:10:10

标签: asp.net updatepanel dopostback

我有一个自定义控件(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返回的参数,但在第二种情况下,将触发完整而非部分回发。

有什么想法吗?

提前致谢,

乔治

1 个答案:

答案 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)