摘 要 在基于b/s结构的网络信息系统开发中,结合asp.net与客户端的javascript脚本, 开发能与数据库进行交互的电子沙盘。沙盘中图标的参数存取由客户端与服务器交互完成,图标的移动和图标的信息浏览依靠客户端实现。文章结合系统开发实例,详细阐述了这一方法的实现过程。
关键词 asp.net javascript 电子沙盘
引 言
asp.net技术是用于的全新框架,它完全基于模块与组件,给人员提供更多的灵活性,是创建web应用程序的有效工具。asp.net特别适用于开发动态的web站点,使网页与用户之间不仅仅是显示和浏览的关系,而且还是动态交互的关系。大部份的交互任务都可由asp.net的服务器端代码来完成。笔者为某单位开发的b/s结构网络信息系统,除一般功能外,还需要特别设计地理模块。因其众多的下属子单位的地理位置会比较频繁地发生变动,而业务工作与地理位置的配置又有着重要关系,为此,要在系统中引入基于数据库支持的电子沙盘。使各级用户按权限查看和配置子单位在地图上分布。
电子沙盘的基本原理是在以地图为背景的网页中生成多个可以移动的图标,每一个图标代表一个子单位。但在web上仅靠asp.net来实现沙盘功能是比较困难的,因为它对交互性提出了更高的要求。这主要体现在两个方面:一是沙盘与数据库服务器的交互,这主要体现在沙盘数据在数据库中的存取;二是沙盘与用户的交互,这主要体现在用户在地图中移动图标(鼠标拖动动作)以及浏览图标的信息(鼠标点击动作)两个方面。在实际操作中,沙盘与用户的交互是比较频繁的,如果每一次动作都要求浏览器和服务器建立一次往返行程,必然会受到网速、服务器性能等因素的制约,从而延长用户操作的等待时间,降低沙盘的实用性。
为此,要引入javascript技术,来满足这种实时交互的需求。javascript是一种基于对象(object)和事件驱动(event driven)并具有安全性能的脚本语言。javascript脚本嵌入在网页中,运行时javascript代码和网页一起下载到浏览器。当用户的一些操作不涉及到数据存取时,如移动图标与浏览图标信息这两项主要的沙盘操作,就可以由javascript脚本来实现,从而使用户、浏览器、服务器之间的三层交互变成了用户、浏览器之间的两层交互,有效提高网页反应的快速性和灵活性。
设计思路
本文所述的信息系统,以windows 2000 server+iis5.0+.net作为平台,采用asp.net+c#.net构造程序框架, sql server 2000为后台数据库。针对该单位分为总部—分区—子单位三层结构,按行政级别规定了不同的权限:总部级用户具有对全部子单位的浏览权和调配权,分区级用户具有对本分区子单位的浏览权和调配权,子单位具有地理配置权。
为尽量减少客户端与服务器的交互次数,电子沙盘的运行过程应分为三个步骤进行:第一步是在网页加载时,web服务器从数据库服务器中提取图标参数(坐标值与基本信息),将javascript代码和网页一起下载到客户端;第二步是由javascript脚本负责执行沙盘与用户的交互(配置图标与浏览图标信息);第三步是在用户选择保存设置时,web服务器接收来自客户端的坐标值等参数,并赋值给数据库服务器的存储过程,由存储过程执行数据的保存。
程序设计
1、网页加载
web服务器根据用户id从数据库中提取其所属的图标参数(坐标值和基本信息),再根据坐标值将图标定位在地图中,同时将图标基本信息写入网页代码。在网页加载完毕以后,生成的图标会配置在地图上的指定位置,且附带了基本信息。节选程序如下:
private void page_load(object sender, system.eventargs e) //初始化
{
if (!ispostback) //程序是否是第一次执行
{
string strconn=configurationsettings.appsettings["connectionstring"];
sqlconnection cn=new sqlconnection(strconn);
sqlcommand cm9=new sqlcommand("sp_sketchmap",cn); //提取子单位名称及坐标值
cm9.commandtype=commandtype.storedprocedure;
cm9.parameters.add("@unitid",sqldbtype.varchar,50); //使用者单位编码
cm9.parameters["@unitid"].value=session["unitid"].tostring();
cm9.parameters.add("@d1",sqldbtype.varchar,50); //1号子单位名称
cm9.parameters["@d1"].direction=parameterdirection.output;
cm9.parameters.add("@d1a",sqldbtype.int); //1号子单位横坐标
cm9.parameters["@d1a"].direction=parameterdirection.output;
cm9.parameters.add("@d1b",sqldbtype.int); //1号子单位纵坐标
cm9.parameters["@d1b"].direction=parameterdirection.output;
cm9.parameters.add("@d1c",sqldbtype.varchar,100); //1号子单位基本信息
cm9.parameters["@d1c"].direction=parameterdirection.output;
……
2、客户端操作
asp.net中的web控件没有坐标属性,因此它们不能在网页中移动。可以采用html控件中的label控件(div),把它当成一个可以移动的层来使用,在这个层上嵌入一个image控件,两者合并在一起即可作为活动的图标。
编写的javascript脚本主要有两类:一类是拖动动作,即图标可以被鼠标拖动到地图上的某一位置;另一类是点击动作,在图标被选中状态下,单击鼠标的右键可以显现图标的基本信息。节选程序如下:
<script language="javascript"> // javascript脚本
……
function dragit(evt) // 鼠标拖动动作
{
……
if (selectedobj) {
shiftto(selectedobj, (window.event.clientx - offsetx), (window.event.clienty - offsety))
document.forms(0).textbox1.value=window.event.clientx – offsetx
document.forms(0).textbox2.value=window.event.clienty – offsety
document.forms(0).textbox3.value=window.event.srcelement.id
}
}
……
function rightclick(){ //鼠标右键点击动作
if (event.button==2){
linkex.innerhtml=document.forms(0).textboxd1c.value linkex.style.postop=plane1.style.postop+20
linkex.style.posleft=plane1.style.posleft+20
linkex.style.backgroundcolor="pink"
linkex.style.visibility="visible"
}
}
</script>
3、坐标值保存
在用户完成图标的配置后,可选择保存设置,这一动作由web控件button按钮的click事件激发。web服务器将用户id、图标id和坐标值赋传送给数据库服务器的存储过程,由存储过程将数据保存到数据库表中。节选程序如下:
private void button1_click(object sender, system.eventargs e)
{
string strconn=configurationsettings.appsettings["connectionstring"];
sqlconnection cn=new sqlconnection(strconn);
sqlcommand cm9=new sqlcommand("sp_sketchmap_modify",cn); //保存子单位坐标
cm9.commandtype=commandtype.storedprocedure;
cm9.parameters.add("@unitid",sqldbtype.varchar,50); //使用者单位编码
cm9.parameters["@unitid"].value=session["unitid"].tostring();
cm9.parameters.add("@d1",sqldbtype.varchar,50); 1号子单位名称
cm9.parameters["@d1"].value=textboxd1.text.trim();
cm9.parameters.add("@d1a",sqldbtype.int); 1号子单位横坐标
cm9.parameters["@d1a"].value=int32.parse(textboxd1a.text.trim());
cm9.parameters.add("@d1b",sqldbtype.int); //1号子单位纵坐标
cm9.parameters["@d1b"].value=int32.parse(textboxd1b.text.trim());
……
cm9.connection.open();
cm9.executenonquery();
cm9.connection.close();
……
结束语
电子沙盘的另外一个功能是导入地图,当地图的情况发生变化时,可以及时进行替换,为保证坐标的准确性,要求导入地图要与原有地图的大小相同。因方法较为简单,不再赘述。
本文所设计的电子沙盘开发方法,已成功应用于b/s结构的网络信息系统,实际运行表明该方法是十分可靠与实用的。如果要拓展其功能,还可以在此基础上做更进一步的修改和完善。