在设计asp.net web时,我们有时需要弹出消息框来提示用户信息,通常可采用下面几种方式:
方式一
aspx代码
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="page1.aspx.cs" Inherits="HYSGLXT.page1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script type="text/javascript">
function showAlert() {
alert('这是一个动态弹出的消息框!');
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
page1
<asp:Button ID="btnCreate" runat="server" Text="新建" OnClientClick="showAlert();" />
</div>
</form>
</body>
</html>
无需后台任何代码,点击按钮即可弹出消息框。
方式二
aspx代码
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="page1.aspx.cs" Inherits="HYSGLXT.page1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
page1
<asp:Button ID="btnCreate" runat="server" Text="新建" OnClick="btnCreate_Click" />
</div>
</form>
</body>
</html>
后台代码:
protected void btnCreate_Click(object sender, EventArgs e)
{
script = "alert('这是一个弹出消息框!');";
Page.ClientScript.RegisterStartupScript(this.GetType(), "MessageScript", script, true);
}
点击按钮能正常弹出消息框。
方式三
aspx代码
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="page1.aspx.cs" Inherits="HYSGLXT.page1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<div>
page1
<asp:Button ID="btnCreate" runat="server" Text="新建" OnClick="btnCreate_Click" />
</div>
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
</html>
后台代码:
protected void btnCreate_Click(object sender, EventArgs e)
{
string script = "alert('这是一个弹出消息框!');";
ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "Key", "alert('Hello World');", true);
}
点击按钮正常弹出消息框。
请注意方式二和方式三的区别,如果按钮放在<asp:UpdatePanel>内仍使用Page.ClientScript.RegisterStartupScript则不会弹出消息框,原因分析如下:
原始代码
1<body>
2 <form id="form1" runat="server">
3 <div>
4 page1
5 <asp:Button ID="btnCreate" runat="server" Text="新建" OnClick="btnCreate_Click" />
6 </div>
7 </form>
8</body>
在这个例子中,btnCreate_Click
事件会触发一个完整的页面回发(postback)。这意味着服务器端的btnCreate_Click
方法会被调用,整个页面会被重新加载,所有服务器控件的状态都会被重置。
如果在btnCreate_Click
方法中注册了一个客户端脚本来显示一个消息框(比如使用Page.ClientScript.RegisterStartupScript
),那么这个脚本会在页面加载完成后被执行。因为这是一个完整的页面回发,所以脚本应该能够正常运行并弹出消息框。
修改后的代码
1<body>
2 <form id="form1" runat="server">
3 <asp:ScriptManager ID="ScriptManager1" runat="server" />
4 <asp:UpdatePanel ID="UpdatePanel1" runat="server">
5 <ContentTemplate>
6 <div>
7 page1
8 <asp:Button ID="btnCreate" runat="server" Text="新建" OnClick="btnCreate_Click" />
9 </div>
10 </ContentTemplate>
11 </asp:UpdatePanel>
12 </form>
13</body>
在这个例子中,UpdatePanel
被用来包裹按钮和相关的内容。当btnCreate_Click
被触发时,只有UpdatePanel
内的内容会刷新,而不是整个页面。因此,服务器端的btnCreate_Click
方法会被调用,但只有UpdatePanel
内部的内容会被更新。
如果在btnCreate_Click
方法中注册了一个客户端脚本来显示一个消息框,那么这个脚本会在异步请求完成时被执行。问题是,这个脚本可能不会像预期那样运行,因为异步请求的生命周期不同于完整页面回发的生命周期。