在VB.Net中指令保存控件顺序

时间:2013-07-01 18:33:24

标签: javascript asp.net vb.net

我有一个包含占位符的父页面。 包含IFrame的跨度元素会添加到此占位符,因为需要新的IFrame。 每个IFrame都包含一个asp控件。 父母有这个代码,触发了父页面的点击:

function saveAll() {

        for (i = 0; i < frames.length; i++) {
            for (j = 0; j < frames[i].length; j++) {
                if(frames[i][j] != null && frames[i][j] != ''){document.getElementById(frames[i][j].toString()).contentWindow.Save();}
            }
        }
    }

在每个控件中调用一个save函数,然后触发按钮单击,这会触发该特定控件的服务器端保存功能。对于那些试图在30秒内阅读此内容的人......可能会发现上一句话令人困惑......所以希望这可能会澄清这里的大局:

enter image description here

我遇到的问题是服务器正在按顺序处理控件,尽管订购的是帧。

上述javascript中的frame对象是一个如下组织的2D数组:


[[controlA_instanceA,controlA_instanceB,controlA_instanceC],
[controlB_instanceA,controlB_instanceB],
[controlC_instanceA,controlC_instanceB等],
[等]]

循环,子控件的触发和frames数组都正常工作(因此我没有在这里显示代码)。但是,是否有人能指出我如何强制执行服务器处理控件的顺序?

1 个答案:

答案 0 :(得分:0)

您的控件需要为其分配序列号。然后保存所有内容的第一步是将2D数组分解为按序列号组织的一维数组。

当您将项目添加到frames数组时,您需要将它们添加为具有两个成员的对象:

var seqNo = 0; // at some point early in the script

...

frames[x][y] = {frame: (iFrame), sequence: seqNo}; //When the Control is added
seqNo++;

其中(iFrame)是框架的ID。

然后你的保存所有功能将如下所示:

function saveAll() {

    var iFrames = [];

    for (i = 0; i < frames.length; i++) 
    {
        for (j = 0; j < frames[i].length; j++) {
            if(frames[i][j] != null && frames[i][j] != '')
            {
                iFrames.push(frames[i][j]);
            }
        }
    }

    iFrames.sort(function(a,b){ return a.sequence - b.sequence});

    for ( t = 0; t < iFrames.length; t++)
    {
        document.getElementById(iFrames[t].frame.toString()).contentWindow.Save();
    }
}

通过这种方式,您可以确保保留订单,因为您按序列号对数组进行了排序。

这就是说,问题可能是数组似乎已排序,但它不是,而且并不是假设问题是服务器响应点击事件的顺序。

修改

如果服务器无法响应事件,那么您可能需要采用不同的方法。

如果这是一个ajax网站,并且您通过网络方法发回,那么我建议创建一个新的网络方法,将数组作为参数。

将您要保存的所有内容推送到数组中,然后将其传递回服务器以便按特定顺序进行处理。

如果这是一个经典表单网站,那么您可以在页面加载事件中处理自定义回发。

无论哪种方式,您都需要重新评估其处理方式。