在做ASP.net的项目时,碰到在页面上输入一些数据后,然后点击提交按钮,然后服务器端校验数据,如果数据不合格,用
Response.Write("<script>alert(' 用户名不存在!')</script>")
向客户端推出一个警告窗口提示,这时候会发现,显示警告窗口的时候,在警告窗口的背面页面是一片空白,非得你按了警告窗口上的确定按钮,主页面才会显示出需要的内容。
为什么会出现一个页面白板呢?包括服务器端向客户端推出的 showModalDialog 模态窗口一样,用 Response.Wrtie()输出到客户端页面,可以通过查看生成页面的源文件,就能发现是在页面的最前面加上了 alert() 或 showModalDialog() js函数,这种警告窗口或模态窗口弹出来之后,将会阻止页面显示接下来的内容,所以您看到的就是一片空白,只有用户关了警告或模态窗口才会继续显示页面内容。那么怎么才能让显示 alert对话框或 showModalDialog 窗口时,主页面有内容显示呢?很简单,需要让生成的 html 中 alert 和 showModalDialog 处在显示内容的后面。
下面这个做法是:用Page.RegisterStartupScript()方法注册页面执行脚本,它会把注册的脚本放在Web 窗体的结尾处,即</form>标记之前
Page.RegisterStartupScript("msg", "<script>alert('用户名Unmi不存在!')</script>");
也就是 form 的内容显示完之后才执行这一段脚本--弹出警告窗口,所以页面不会空白。如果这个 WebForm 几乎包含了页面所有显示内容,那么从语义上讲也可以说是在 document 加载完后弹出警告窗口。
由此我们也能想到,如果给页面加个 window.onload 事件的处理函数,在这个处理函数中弹出警告窗口,那么不管是放在前面还是后面都不会影响到页面的显示(不会出现白板现象),因为它总是等待document加载完成后才执行的,因此我们也可以这样写:
Response.Write("<script >function window.onload() {alert('用户名Unmi不存在!');}</script>"); //这里重写了 window 的 onload 函数。
另外:还有 RegisterClientScriptBlock 也可用来解决类似问题,在Page.RegisterClientScriptBlock和Page.RegisterStartupScript有何区别?一文中说,RegisterClientScriptBlock 一般返回的是客户端函数的包装,而 RegisterStartupScript 返回得函数在 document 装载完成后会执行,类似于我们平时所说的body onload="f()" 里面的函数;这两个方法在客户端呈现的代码位置不同,RegisterClientScriptBlock 在 <form runat=server> 之后,而 RegisterStartupScript 在 </form> 之前。
要更清楚的知道 RegisterClientScriptBlock 和 RegisterClientScriptBlock 有什么区别,只要观察一下生成的 HTML 源文件就知道了。
参考:1. 如何从服务器端向客户端弹出alert()对话框,但不会出现使页面变白版。
2. Page.RegisterClientScriptBlock和Page.RegisterStartupScript有何区别?
3. RegisterClientScriptBlock的使用
4. Asp.net中RegisterStartupScript方法的使用
5. asp.net 显示消息对话框类
本文链接 https://yanbin.blog/asp-net-alert-from-server-side/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。