前言
上一篇「让 ASP.NET 也可以使用 MsgBox 方法」文章中提到如何封装 JavaScript 的 alert 方法,另一个常使用在客户端处理「询问讯息」的就是 JavaScript 的 confirm 方法,在此篇文章我们将撰写自用的 Confirm 方法,使页面的程序代码尽量不要直接去撰写 JavaScript 程序代码,以增加系统的维护性。
程序实作
我们将使用「撰写自用的 ScriptManager 来管理客户端指令码」文中提及的 TBScriptManager 类别为基础,在 TBScriptManager 类别新增处理「询问讯息」会使用到相关方法。我们在 TBScriptManager 类别新增二个 GetConfirmScript 多载方法,用以取得询问讯息相关的 JavaScript 程序代码;另新增 Confirm 方法来直接注册询问讯息的客户端指令码,以下将以实例说明这三个方法的使用时机及方式。
''' <summary>
''' 客户端指令码管理。
''' </summary>
Public Class TBScriptManager
''' <summary>
''' 处理消息正文的跳脱字符。
''' </summary>
''' <param name="Message">消息正文。</param>
Private Function ParserMessage(ByVal Message As String) As String
Dim sMessage As String
sMessage = Strings.Replace(Message, "'", "\'") '处理单引号
sMessage = Strings.Replace(sMessage, vbNewLine, "\n") '处理换行
Return sMessage
End Function
''' <summary>
''' 取得讯问窗口的客户端指令码。
''' </summary>
''' <param name="Message">消息正文。</param>
Public Overloads Function GetConfirmScript(ByVal Message As String) As String
Dim sMessage As String
Dim sScript As String
sMessage = ParserMessage(Message)
sScript = String.Format("if (confirm('{0}')==false) {{return false;}}", sMessage)
Return sScript
End Function
''' <summary>
''' 取得讯问窗口的客户端指令码。
''' </summary>
''' <param name="Message">消息正文。</param>
''' <param name="TrueScript">响应 true 时要执行的客户端指令码。</param>
''' <param name="FalseScript">响应 false 时要执行的客户端指令码。</param>
Public Overloads Function GetConfirmScript(ByVal Message As String, _
ByVal TrueScript As String, ByVal FalseScript As String) As String
Dim sMessage As String
Dim sScript As String
sMessage = ParserMessage(Message)
sScript = String.Format("if (confirm('{0}')){{ {1} }} else {{ {2} }}", sMessage, TrueScript, FalseScript)
Return sScript
End Function
''' <summary>
''' 询问窗口。
''' </summary>
''' <param name="Message">消息正文。</param>
''' <param name="TrueScript">响应 true 时要执行的客户端指令码。</param>
''' <param name="FalseScript">响应 false 时要执行的客户端指令码。</param>
Public Sub Confirm(ByVal Message As String, ByVal TrueScript As String, ByVal FalseScript As String)
Dim sScript As String
sScript = GetConfirmScript(Message, TrueScript, FalseScript)
Me.RegisterStartupScript("Confirm", sScript)
End Sub
End Class
案例一:按钮加上询问讯息,按「确定」才会引发按钮的 Click 事件
按钮加上询息讯息是常使用到的案例,例如按下删除钮时,先询问用户是否确定删除数据,当按「确定」时才会真正去执行删除动作。我们可以在 Page Load 事件中,去设定 Button.OnClientClick 属性,加入询问讯息的客户端指令码。
案例二:纯客户端的询问讯息
询问讯息只是在客户端执行,并不会产生 PostBack。
案例三:先执行伺服端程序再弹出询问讯息,依客户端响应再接续执行
例如有登打请假单储存时,执行储存完毕要弹出一个是否送审询问讯息。在 WinForm 撰写这个程序代码非常单纯,只要在储存后弹出询问讯息,等待用户响应接续执行后面的程序代码即可。可是在 WebForm 要撰写相同的功能就有点麻烦了,因为整个程序的流程是在伺服端及客户端交互运作。
请假单储存(伺服端) -> 弹出询问讯息(客户端) -> 取得客户端响应决定是否送审(伺服端)
在 WebForm 要处理这类问题,要分为二个阶段处理,第一个阶段处理「请假单储存(伺服端) -> 弹出询问讯息(客户端) 」,在下面的程序代码中,讯问讯息的响应结果无论是「确定」或「取消」都会产生 PostBack 动作传不同的参数。
第二阶段在 Page Load 事件处理客户端询问讯息的响应「取得客户端响应决定是否送审(伺服端)」
使用 VB6 或 VB.NET 的开发人员,一定常会使用到 MsgBox 这个函式来显示讯息,如果使用 VB.NET 在开发 ASP.NET 程序,会发现似乎 MsgBox 这个函式好像可以使用,就直接使用 MsgBox 来显示讯息。
在 VS 开发环境中执行程序,MsgBox 函式好像也可以正常显示讯息;可是一旦网站发布出去后,就会发现 MsgBox 函式失效了。这是什么原因呢?MsgBox 函式是伺服端的语言,而客户端只能透过浏览器解析 HTML 及 JavaScript,所以 MsgBox 函式是无法使用在 ASP.NET 的程序,只能在开发侦错时使用。在 ASP.NET 中,要在客户端显示讯息正确的方法是要使用 RegisterStartupScript 方法来输出 JavaScript 的 alert 函式。
是不是觉得在 ASP.NET 中要显示讯息麻烦多了,能否让 ASP.NET 中也可以使用 MsgBox 来显示讯息呢?其实方法很简单,就是自己写一个 MsgBox 方法就好了,就可以延用以前习惯的 MsgBox 来显示讯息。我们在 BasePage 中撰写 MsgBox 方法,这个 MsgBox 方法还处理消息正文中含「单引号」及「换行」的部分,将这些特殊字符串转换为对应的 JavaScript 跳脱字符。
所有继承 BasePage 的页面都可以使用 MsgBox 方法来显示讯息。
![]()
備註:處理 JavaScript 的相關函式,筆者比較建議使用「撰寫自用的 ScriptManager 來管理用戶端指令碼」一文中提供的方式來處理,所以可以將 MsgBox 方法撰寫在該文中的 TBScriptManager 類別。