有心栽花花不开,无心插柳柳成荫

人生不易,自得其乐

导航

物流系统中应用AJAX

Posted on 2006-03-24 10:50  薛冰  阅读(1068)  评论(2编辑  收藏  举报
       最近完成了一个B/S的物流管理系统,对于在其中使用的一些新技术做一个总结。此为上篇《利用XML实现通用WEB报表打印实际使用中的例子 》的继续。
       为了解决服务器端页面刷新引起的用户不适和减少无需修改数据重新加载的延时,在单据查询,数据保存,数据修改等操作时采用了AJAX无刷新技术,简单介绍如下:

(一).aspx 页面
包含页面布局,调用隐藏窗体执行操作返回XML并加载到本窗体的javascript代码:
    //根据输入单据号,查询单据该单据信息并在页面上显示
    function DisplayNoteInfo(ctlRowId,ctlNoteNo,ctlHidStockId,ctlHidMoveType,tableId){
                
        
//发给后台处理    
        //alert("hidGetNotesMaster.aspx?NoteNo=" + emNo.value + "&StockId=" + emStockId.value + "&MoveType=" + emTypeCode.value);                
        oHttpReq.open("POST""frmhidInOutInform.aspx?globalNo="+ emNoteNo.value +"&stockId=" + emStockId.value + "&actionType=" + emTypeCode.value  , false);
        
        oHttpReq.send(
"");
        
        xmlResult 
= oHttpReq.responseText;
            
        oDoc.loadXML(xmlResult);
        
        
var dataItems = new Array();        
        
var detailItems = new Array();    
        
        dataItems[
0= oDoc.selectNodes("//InformMaster/CUSTOMER_NAME");

        
//  

        detailItems[
0= oDoc.selectNodes("//InformDetail/BILL_NO");
        
//             
        
        
        
//主表
        if (dataItems[0].length==0 )    //客户名称为空,表示查询单据数据为空
        {    
                            
            hasGet 
= false;

        }
    
        
else     //查询单据到了数据
        {
            
            
//客户
            var emCustomAddr = document.getElementById('txtCustomName');
            
if(dataItems[0].length > 0){
                emCustomAddr.value 
= dataItems[14][0].text;                            
            }

            
else{
                emCustomAddr.value
="";
            }
            
                    
            hasGet 
= true;
            
        }

        
        
        
//明细表        
        if (detailItems[0].length==0)//PROD_TYPE为空
        {
            
//hasGet = false;                
        }

        
else{
            
for(var i=0;i<=detailItems[0].length-1;i++){//逐个遍历
            
                
var newRowId;
            
                newRowId 
= NewRow(tableId);    //在表的最后新增一行
                newRowId = parseInt(newRowId);
                            
                eval(
"document.all.item(txtBoxCtl[j],newRowId-1).value=detailItems[j][i].text");                                
            }
    
                        
            hasGet 
= true;                
        }
    
        
        
return hasGet;

    }

(二)隐藏窗体在后头工作,返回XML文件
            globalNo = Request.QueryString("globalNo")

            stockIdStr 
= Request.QueryString("stockId")

            Select Case actionType '根据出入库类型选择操作

                Case 
"XIAOSHOUCHUKU" '销售出库

                    Dim SaleOutAction As New OutSaleAction

                    '检索销售出库主表
                    Ds 
= SaleOutAction.GetInformInfo(globalNo, stockIdStr, notFinished)

                    Dim writer As New System.Xml.XmlTextWriter(Response.OutputStream, New System.Text.UTF8Encoding)

                    writer.Formatting 
= System.Xml.Formatting.Indented
                    writer.Indentation 
= 4
                    writer.IndentChar 
= " "

                    Ds.WriteXml(writer)
                    writer.Flush()
                    writer.Close()

(三).要注意的问题
1.窗体间通过post方法传递的参数值最大不能超过4K,否则javascript执行直接出错。
2.我在项目中添加了三个隐藏窗体,分别为:hidInform检索单据信息,hidAction保存等操作,hidXml取得打印单据XML文件。
3.对于隐藏窗体的访问权限,必须是由系统指向的才有权限,直接输入url不允许访问。

        If Request.UrlReferrer Is Nothing Then
            Response.Write(
"<script language='javascript'>alert( '非法的访问方法!');</script>")
            Response.Write(
"<script language='javascript'>parent.location.href='default.aspx';</script>")
            
Exit Sub
        
End If

好了,今天就写到这儿。使用的技术很简单,之所以写出来,一是对给新入门的朋友提供一点帮助,二是自己总结提高。欢迎讨论。