I know I can hook into the client side events to run JavaScript after every partial postback; however, I want to do something like this:
我知道我可以挂钩客户端事件,在每次部分回发后运行JavaScript;但是,我想做这样的事情:
protected void FooClicked(object sender, EventArgs e) {
ClientScript.RegisterStartupScript(GetType(), "msg", "showMsg('Foo clicked');",true);
}
I know I could totally hack it with hidden fields and run something after every postback, but there should be a pretty straightfoward way to in a similar fashion to this.
我知道我可以用隐藏的字段完全破解它并在每次回发后运行一些东西,但应该有一种非常直接的方式以类似的方式来实现这一点。
4 个解决方案
#1
The specific code sample you are describing does not work with partial post-backs, since ClientScript.RegisterStartupScript()
writes JS to the page during the output construction phase of the request lifecycle; whereas a partial postback only updates a selected portion of the page via JavaScript (even though the markup for the entire page, including your startup script, is generated on the server).
您正在描述的特定代码示例不适用于部分回发,因为ClientScript.RegisterStartupScript()在请求生命周期的输出构建阶段将JS写入页面;而部分回发只通过JavaScript更新页面的选定部分(即使整个页面的标记,包括您的启动脚本,也是在服务器上生成的)。
To closely mimic what you are describing, you ought to include a Literal control inside your UpdatePanel, and during partial postback set the Text property of the content panel to the script you wish to run:
要密切模仿您所描述的内容,您应该在UpdatePanel中包含一个Literal控件,并在部分回发期间将内容面板的Text属性设置为您希望运行的脚本:
myLiteral.Text = "<script type=\"JavaScript\">doStuff();</script>";
IMO, a more proper way is to use the client-side API for async postbacks to register an event handler to run when the postback completes:
IMO,更合适的方法是使用客户端API进行异步回发,以便在回发完成时注册要运行的事件处理程序:
function endRequestHandler(sender, args) {
doStuff();
}
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler);
If you need to pass information which was generated during the postback into the handler, you can pass that via hidden fields and grab that from the DOM in your client-side handler.
如果需要将回发期间生成的信息传递给处理程序,可以通过隐藏字段传递,并从客户端处理程序中的DOM中获取。
#2
This is much more elegant, IMO. apparently ASP AJAX will call any JS function named pageLoad. so write a function called pageLoad and it will be executed on every page load, even after partial update.
这更优雅,IMO。显然ASP AJAX会调用名为pageLoad的任何JS函数。所以写一个名为pageLoad的函数,即使在部分更新之后,它也会在每个页面加载时执行。
#3
<script type="text/javascript" language="javascript">
function ValidateUserRole() {
var answer = confirm("Are you sure..................")
if (answer) {
var btnRoleReleatedButton = '<%=btnRoleReleatedButton.ClientID%>';
document.getElementById(btnRoleReleatedButton).click();
}
else {
return false;
}
}
</script>
Tier 3 :<asp:UpdatePanel ID="upTier3Details" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:DropDownList ID="ddlTier3" runat="server" CssClass="ddlextralarge" Width="350" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="ddlUserRole" EventName="SelectedIndexChanged" />
</Triggers>
</asp:UpdatePanel>
#4
the best way to do this is to use the DoAfterPostBack control. you can download this control for free from here http://go2amitech.blogspot.com/2010/08/running-specific-javascript-after.html
最好的方法是使用DoAfterPostBack控件。你可以从这里免费下载这个控件http://go2amitech.blogspot.com/2010/08/running-specific-javascript-after.html
#1
The specific code sample you are describing does not work with partial post-backs, since ClientScript.RegisterStartupScript()
writes JS to the page during the output construction phase of the request lifecycle; whereas a partial postback only updates a selected portion of the page via JavaScript (even though the markup for the entire page, including your startup script, is generated on the server).
您正在描述的特定代码示例不适用于部分回发,因为ClientScript.RegisterStartupScript()在请求生命周期的输出构建阶段将JS写入页面;而部分回发只通过JavaScript更新页面的选定部分(即使整个页面的标记,包括您的启动脚本,也是在服务器上生成的)。
To closely mimic what you are describing, you ought to include a Literal control inside your UpdatePanel, and during partial postback set the Text property of the content panel to the script you wish to run:
要密切模仿您所描述的内容,您应该在UpdatePanel中包含一个Literal控件,并在部分回发期间将内容面板的Text属性设置为您希望运行的脚本:
myLiteral.Text = "<script type=\"JavaScript\">doStuff();</script>";
IMO, a more proper way is to use the client-side API for async postbacks to register an event handler to run when the postback completes:
IMO,更合适的方法是使用客户端API进行异步回发,以便在回发完成时注册要运行的事件处理程序:
function endRequestHandler(sender, args) {
doStuff();
}
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler);
If you need to pass information which was generated during the postback into the handler, you can pass that via hidden fields and grab that from the DOM in your client-side handler.
如果需要将回发期间生成的信息传递给处理程序,可以通过隐藏字段传递,并从客户端处理程序中的DOM中获取。
#2
This is much more elegant, IMO. apparently ASP AJAX will call any JS function named pageLoad. so write a function called pageLoad and it will be executed on every page load, even after partial update.
这更优雅,IMO。显然ASP AJAX会调用名为pageLoad的任何JS函数。所以写一个名为pageLoad的函数,即使在部分更新之后,它也会在每个页面加载时执行。
#3
<script type="text/javascript" language="javascript">
function ValidateUserRole() {
var answer = confirm("Are you sure..................")
if (answer) {
var btnRoleReleatedButton = '<%=btnRoleReleatedButton.ClientID%>';
document.getElementById(btnRoleReleatedButton).click();
}
else {
return false;
}
}
</script>
Tier 3 :<asp:UpdatePanel ID="upTier3Details" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:DropDownList ID="ddlTier3" runat="server" CssClass="ddlextralarge" Width="350" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="ddlUserRole" EventName="SelectedIndexChanged" />
</Triggers>
</asp:UpdatePanel>
#4
the best way to do this is to use the DoAfterPostBack control. you can download this control for free from here http://go2amitech.blogspot.com/2010/08/running-specific-javascript-after.html
最好的方法是使用DoAfterPostBack控件。你可以从这里免费下载这个控件http://go2amitech.blogspot.com/2010/08/running-specific-javascript-after.html