ASP.NET中MessageBox的实现
asp.net中没有MessageBox这个控件,固然可以插入Winform里的MessageBox,但一般不提倡,所以只能变通实现,主要有这几种方法:
1.直接利用javascript的alert和confirm函数:
在服务端的写法是:
1)alert
ScriptManager.RegisterStartupScript(this, typeof(Page), Guid.NewGuid().ToString(), "alert('Nothing changed.')", true);
2)confirm
将弹出窗口的onclick事件和confirm联系起来:
SaveButton.Attributes.Add("onclick", "return confirm('Are you sure you want to save it?');");
2.利用ajaxToolKit里的ModalPopupExtender和ConfirmButton两个控件:
1)ModalPopupExtender
在aspx文件里的写法:
< ajaxToolkit:ModalPopupExtender runat="server" ID="msgBox" TargetControlID="hiddenTargetControlForModalPopup"
PopupControlID="messageboxPanel" BackgroundCssClass="messagebox_parent" DropShadow="False"
RepositionMode="RepositionOnWindowResizeAndScroll" />
< asp:Button runat="server" ID="hiddenTargetControlForModalPopup" Style="display: none;" />
< asp:Panel runat="server" ID="messageboxPanel" Style="display:none; border: #003399 2px solid; width: 400px; height: 125px;">< div style="text-align:center">Are you sure you want to save it?< /div >< div style="text-align:center" > < asp:Button id="okbutton" runat="server" onclick="okbutton_click" /> < asp:Button id="cancelbutton" runat="server" onclick="cancelbutton_click" />< /asp:Panel>
使用时,在服务端用msgBox.Show()方法来打开,用msgBox.Hide()方法关闭.
2)ConfirmButton
在aspx里:
< %@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajaxToolkit" %>
< ajaxToolkit:ConfirmButtonExtender Id="confirmBox" runat="server" ConfirmText="Are your sure you want to save it?" TargetControlID="saveButton" />
saveButton是保存按钮,当用户选择弹出窗口的OK键后就执行它的onclick事件里的语句.
ajaxToolKit本质上是用DIV来模拟弹出窗口.
3.自定义控件:
其实也是利用div来模拟,只不过做得复杂些.下面是一个实例:
ascx:
< %@ Control Language="C#" AutoEventWireup="true" CodeBehind="MessageBox.ascx.cs"
Inherits="Controls.MessageBox" %>
< %@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajaxToolkit" %>
< style type="text/css">
.messagebox_parent
{
color:Blue;
-moz-opacity:0.12;
background-color:#000;
filter:alpha(opacity=12);
opacity:0.12;
}
.messagebox_content
{
outline-style: none;
outline-style : invert;
outline-width: 0px;
border-bottom: #003399 2px solid;
text-align: center;
border: #003399 2px solid;
background: white;
cursor: auto;
display: block;
width: 400px;
height: 150px;
}
.messagebox_title
{
background: url(../../Images/vertgradient.gif) #003399 repeat-x 50% bottom;
font-size: 12px;
font-weight: bold;
text-decoration: none;
padding: 4px;
border-top: 0;
border-right: 0;
color: white;
vertical-align:baseline;
text-align: left;
cursor:pointer;
}
< /style>
< ajaxToolkit:ModalPopupExtender runat="server" ID="msgBox" TargetControlID="hiddenTargetControlForModalPopup"
PopupControlID="messageboxPanel" BackgroundCssClass="messagebox_parent" DropShadow="False"
RepositionMode="RepositionOnWindowResizeAndScroll">
< /ajaxToolkit:ModalPopupExtender>
< asp:Button runat="server" ID="hiddenTargetControlForModalPopup" Style="display: none;" />
< asp:Panel runat="server" ID="messageboxPanel" CssClass="messagebox_content" Style="display:none; ">
< asp:Panel runat="Server" ID="messageBoxTitleHandle" CssClass="messagebox_title">
< div id="MessageBoxCaption" runat="server">
< /div>
< /asp:Panel>
< div style="float: left; margin-left: 10px; margin-top: 10px;">
< asp:Image ID="messageBoxIcon" runat="server" ImageUrl="../Images/exclamation.gif" style="width: 64px; height: 64px;" />
< /div>
< div style="display:table;height:80px;position:relative;overflow:hidden; text-align:left; padding-left:10px; padding-right: 10px;">
< div style="display:table-cell;vertical-align:middle;position:absolute;top:50%;">
< div id="MessageBoxText" runat="server" style="position:relative;top:-50%;">
< /div>
< /div>
< /div>
< div>
< asp:Button runat="server" ID="button1" Text="button1" style="width:70px; margin:5px;" onclick="Button_Click" />
< asp:Button runat="server" ID="button2" Text="button2" style="width:70px; margin:5px;" onclick="Button_Click" />
< asp:Button runat="server" ID="button3" Text="button3" style="width:70px; margin:5px;" onclick="Button_Click" />
< /div>
< /asp:Panel>
ascx.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Threading;
namespace Controls
{
public partial class MessageBox : System.Web.UI.UserControl
{
public event EventHandler<MessageBoxArgs> MessageBoxButtonClick;
protected void Page_Load(object sender, EventArgs e)
{
}
private void SetButton(Button button, DialogResult dialogResult)
{
button.Text = dialogResult.ToString();
button.Attributes["DialogResult"] = ((byte)dialogResult).ToString();
if (dialogResult == DialogResult.None)
{
button.Style["display"] = "none";
}
else
{
button.Style["display"] = "inline";
}
}
public void Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon)
{
switch (buttons)
{
case MessageBoxButtons.AbortRetryIgnore:
SetButton(button1, DialogResult.Abort);
SetButton(button2, DialogResult.Retry);
SetButton(button3, DialogResult.Ignore);
break;
case MessageBoxButtons.OK:
SetButton(button1, DialogResult.OK);
SetButton(button2, DialogResult.None);
SetButton(button3, DialogResult.None);
break;
case MessageBoxButtons.OKCancel:
SetButton(button1, DialogResult.OK);
SetButton(button2, DialogResult.Cancel);
SetButton(button3, DialogResult.None);
break;
case MessageBoxButtons.RetryCancel:
SetButton(button1, DialogResult.Retry);
SetButton(button2, DialogResult.Cancel);
SetButton(button3, DialogResult.None);
break;
case MessageBoxButtons.YesNo:
SetButton(button1, DialogResult.Yes);
SetButton(button2, DialogResult.No);
SetButton(button3, DialogResult.None);
break;
case MessageBoxButtons.YesNoCancel:
SetButton(button1, DialogResult.Yes);
SetButton(button2, DialogResult.No);
SetButton(button3, DialogResult.Cancel);
break;
}
switch (icon)
{
case MessageBoxIcon.Error:
messageBoxIcon.ImageUrl = "../Images/error.gif";
break;
case MessageBoxIcon.Information:
messageBoxIcon.ImageUrl = "~/Images/info.gif";
break;
case MessageBoxIcon.Exclamation:
messageBoxIcon.ImageUrl = "../Images/exclamation.gif";
break;
}
MessageBoxCaption.InnerText = caption;
MessageBoxText.InnerText = text;
msgBox.Show();
}
public void Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, string refNo)
{
messageboxPanel.Attributes["RefNo"] = refNo;
Show(text, caption, buttons, icon);
}
public void Hide()
{
msgBox.Hide();
}
protected void Button_Click(object sender, EventArgs e)
{
if (MessageBoxButtonClick != null)
{
Button button = sender as Button;
if (button != null)
{
DialogResult dialogResult = (DialogResult)(Convert.ToByte(button.Attributes["DialogResult"]));
string refNo = messageboxPanel.Attributes["RefNo"];
MessageBoxArgs args = new MessageBoxArgs(dialogResult, refNo);
MessageBoxButtonClick(this, args);
}
}
}
}
public class MessageBoxArgs : EventArgs
{
private DialogResult _dialogResult;
private string _refNo = string.Empty;
public DialogResult DialogResult
{
get { return _dialogResult; }
}
public string RefNo
{
get { return _refNo; }
}
public MessageBoxArgs(DialogResult dialogResult)
{
_dialogResult = dialogResult;
}
public MessageBoxArgs(DialogResult dialogResult, string refNo)
{
_dialogResult = dialogResult;
_refNo = refNo;
}
}
[Flags]
public enum MessageBoxButtons
{
OK,
OKCancel,
AbortRetryIgnore,
YesNoCancel,
YesNo,
RetryCancel
}
[Flags]
public enum MessageBoxIcon
{
None,
Hand,
Question,
Exclamation,
Asterisk,
Stop,
Error,
Warning,
Information
}
[Flags]
public enum DialogResult
{
None,
OK,
Cancel,
Abort,
Retry,
Ignore,
Yes,
No
}
}
使用时,在aspx文件里:
< %@ Register src="MessageBox.ascx" tagname="MessageBox" tagprefix="uc1" %>
< asp:UpdatePanel ID="UpdatePanel5" runat="server">
< ContentTemplate>
< uc1:MessageBox ID="confirmMsgBox" runat="server" />
< /ContentTemplate>
< /asp:UpdatePanel>
在aspx.cs文件里:
protected void Page_Load(object sender, EventArgs e)
{
confirmMsgBox.MessageBoxButtonClick += onOKClicked;
confirmMsgBox.MessageBoxButtonClick += onCancelClicked;
}
//打开messageBox的代码:
confirmMsgBox.Show("Are you sure you want to save it?", "Confirm", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
//处理按钮事件的代码:
private void onOKClicked(object sender, MessageBoxArgs arg)
{
if (arg.RefNo == "save" && are.DialogResult == DialogResult.OK)
{
//其他代码
}
}
}
private void onCancelClicked(object sender, MessageBoxArgs arg)
{
if (arg.RefNo == "save" && are.DialogResult == DialogResult.Cancel)
{
//其他代码
}
}
}
RefNo属性是为了实现MessageBox的共享,用来区别不同的调用对象.
这个方法的显示效果比较好,共享也比较方便.这是它的优点.缺点是当在一个ModalPopupExtender上使用时,在关闭messageBox的同时也会把后面那个ModalPopupExtender关闭.如果messageBox里一个按钮点击后需要保持后面的那个ModalPopupExtender显示, 另一个按钮点击后关闭后面的那个ModalPopupExtender,可以在前一个按钮的OnClientClick事件里加上:return hideMessageBox('confirmMsgBox');
hideMessageBox函数的代码如下:
function hideMessageBox(controlName) {
var ids = document.getElementsByTagName('INPUT');
for (var i = 0; i < ids.length; i++) {
if (ids[i].id.match(controlName) != null) {
ids[i].style.display = 'none';
}
}
ids = document.getElementsByTagName('DIV');
for (var i = 0; i < ids.length; i++) {
if (ids[i].id.match(controlName) != null) {
ids[i].style.display = 'none';
}
}
ids = document.getElementsByTagName('IMG');
for (var i = 0; i < ids.length; i++) {
if (ids[i].id.match(controlName) != null) {
ids[i].style.display = 'none';
}
}
return false;
}
但是如果不管点击messageBox里的哪个按钮都想保持后面的ModalPopupExtender显示,这个方法就不行了.
4.用模态窗口模拟messageBox:
客户端:(假设使用了master page)
function openMessageWindow(message, type) {
if (message != null && message != '') {
var messageType = document.getElementByID('< %= messageType.ClientID %>');
messageType.value = type;
var dialogResult = window.showModalDialog('messageBoxWindow.aspx?message=' + message, 'Confirm', 'dialogWidth:410px;dialogHeight:182px;center:yes;status:no;resizable:no');
if (dialogResult == "yes") {
var yesButton = document.getElementById('< %= yesButton.ClientID %>');
yesButton.click();
}
else if (dialogResult == "no") {
var noButton = document.getElementById('< %= noButton.ClientID %>');
noButton.click();
}
}
}
< asp:Button ID="yesButton" runat="server" style="display:none"
onclick="yesButton_Click" />
< asp:Button id="noButton" runat="server"
style="display:none" onclick="noButton_Click" />
< asp:HiddenField id="messageType" runat="server" />
服务端的调用代码:
ScriptManager.RegisterStartupScript(this.Page, typeof(Page), Guid.NewGuid().ToString(), "openMessageWindow('Are you sure you want to save it?','save');", true);
return;
}
处理按钮事件的代码:
protected void yesButton_Click(object sender, EventArgs e)
{
if (messageType.Value == "save")
{
//执行保存数据的操作
}
}
messageBoxWindow.aspx文件的内容:
< %@ Page Language="C#" AutoEventWireup="true" CodeBehind="MessageBoxWindow.aspx.cs" Inherits="WebForm.MessageBoxWindow" %>
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
< html xmlns="http://www.w3.org/1999/xhtml" >
< head runat="server">
< title>Confirm</title>
< link href="Content/Style.css" rel="stylesheet" type="text/css" />
< script type="text/javascript">
function setReturnValue(returnString) {
window.returnValue = returnString;
window.close();
}
< /script>
< /head>
< body>
< form id="form1" runat="server">
< div style="text-align:center; margin-top:60px">
< div style="margin-bottom:30px">
< asp:Label ID="messageLabel" runat="server" />
< /div>
< div>
< input type="button" class="button" onclick="setReturnValue('yes')" value="Yes" />
<input type="button" class="button" onclick="setReturnValue('no')" value="No" />
< /div>
< /div>
< /form>
< /body>
< /html>
messageBoxWindow.aspx.cs文件的内容:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebForm
{
public partial class MessageBoxWindow : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
messageLabel.Text = Request.QueryString["message"];
}
}
}
messageType这个HiddenField的作用是实现这个模拟的messageBox能被多个对象共享,用它的值来区分调用对象.
---------------------
本文来自 使我做你和平之子 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/hzzasdf/article/details/4701724?utm_source=copy
ASP.NET中MessageBox的实现的更多相关文章
- Asp.Net中使用OpenRowSet操作Excel表,导入Sql Server(实例)
有两种接口可供选择:Microsoft.Jet.OLEDB.4.0(以下简称 Jet 引擎)和Microsoft.ACE.OLEDB.12.0(以下简称 ACE 引擎). Jet 引擎大家都很熟悉,可 ...
- ASP.NET中使用代码来进行备份和还原数据库
ASP.NET中使用代码来进行备份和还原数据库 SQL代码: 1 2 3 4 5 -- 备份数据库 backup database db_CSManage to disk='c:\backup.ba ...
- ASP.NET中进行消息处理(MSMQ) 三(转)
在本文的前两篇文章里对MSMQ的相关知识点进行了介绍,很多阅读过这前两篇文章的朋友都曾问到过这样一些问题: 1.如何把MSMQ应用到实际的项目中去呢? 2.可不可以介绍一个实际的应用实例? 3. ...
- ASP.NET中进行消息处理(MSMQ) 二(转)
在我上一篇文章<ASP.NET中进行消息处理(MSMQ)一>里对MSMQ做了个通俗的介绍,最后以发送普通文本消息和复杂的对象消息为例介绍了消息队列的使用. 本文在此基础上继续介 ...
- ASP.NET中进行消息处理(MSMQ) 三
在本文的前两篇文章里对MSMQ的相关知识点进行了介绍,很多阅读过这前两篇文章的朋友都曾问到过这样一些问题: 1.如何把MSMQ应用到实际的项目中去呢? 2.可不可以介绍一个实际的应用实例? 3. ...
- ASP.NET中进行消息处理(MSMQ) 二
在我上一篇文章<ASP.NET中进行消息处理(MSMQ)一>里对MSMQ做了个通俗的介绍,最后以发送普通文本消息和复杂的对象消息为例介绍了消息队列的使用. 本文在此基础上继续介绍MSMQ的 ...
- asp.net中导出Excel的方法
一.asp.net中导出Excel的方法: 本文转载 在asp.net中导出Excel有两种方法,一种是将导出的文件存放在服务器某个文件夹下面,然后将文件地址输出在浏览器上:一种是将文件直接将文件输出 ...
- asp.net中导出Execl的方法
一.asp.net中导出Execl的方法: 在 asp.net中导出Execl有两种方法,一种是将导出的文件存放在服务器某个文件夹下面,然后将文件地址 输出在浏览器上:一种是将文件直接将文件输出流写给 ...
- ASP.NET中异常处理的注意事项
一.ASP.NET中需要引发异常的四类情况 1.如果运行代码后,造成内存泄漏.资源不可用或应用程序状态不可恢复,则引发异常.Console这个类中,有很多类似这样的代码: if ((value < ...
随机推荐
- Scala随记
使用Scala首先确保本地Java 8版本,然后按照官网所说,比较流行的方式(1) sbt; (2) IDE "The most popular way to get Scala is ei ...
- 神经网络实现Discuz验证码识别
最近自己尝试了网上的验证码识别代码项目,该小项目见以下链接: https://cuijiahua.com/blog/2018/01/dl_5.html 数据也就用了作者上传的60000张Discuz验 ...
- VB.NET版机房收费系统—数据库设计
之前第一遍机房收费的时候,用的数据库是别人的.认知也仅仅能建立在别人的基础上,等自考中<数据库系统原理>这本书学完了之后,再去看曾经的数据库,发现数据库真的还须要进一步的优化.以下是我设计 ...
- 九度OJ 1092:Fibonacci (递归)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1923 解决:1378 题目描述: The Fibonacci Numbers{0,1,1,2,3,5,8,13,21,34,55...} ...
- Thread join方法的用途
主线程中会创建多个子线程做一些事情,主线程要用到这些子线程处理的数据,因此它需要等待所有的子线程处理完之后才继续运行.这就要用到join方法了.
- 使用 QWorker 做为计划任务引擎
QWorker 提供了 Plan 函数来提供计划任务功能的支持.每个任务做为一个作业,可以在指定的时间点被触发执行.而 cron 作为 Linux 操作系统下计划任务的标准被广大用户所熟知,QWork ...
- java之异常的捕获及处理
在java中程序的错误主要是语法错误和语义错误(也就是逻辑错误). java中异常处理语句的格式: try{ //有可能出现异常的语句 }catch(异常类 异常对象){ //编写异常的处理语句 }c ...
- sam模板
SAM模板 struct SAM{ * ; struct node{ node*nxt[],*fail; int len; }; node*root;int cnt; node no[maxn]; n ...
- SQL JOIN--初级篇
写在前面的话: 以下是最简单的join原理,为后面的大数据分布式join做概念复习和知识铺垫: 有时为了得到完整的结果,我们需要从两个或更多的表中获取结果.我们就需要执行 join. JOIN: 如果 ...
- c# 获取当前行的位置信息
StackTrace st = new StackTrace(new StackFrame(true)); StackFrame sf = st.GetFrame(0); //文件位置 Console ...