ExtJs双ActionResult共用同一Js文件ID冲突解决方案

项目使用MVC+ExtJs实现,权限控制是基于Controller下的ActionResult的,有一个页面因参数不同就需要新建两个ActionResult。

不要问我为何是基于页面级,而不是数据级,我只想说这是历史遗留问题。

现在直面我们的问题,两个ActionResult也就是两个页面,共用同一个Js文件,而这个文件又是ExtJs的,众所周知,ExtJs获取Dom是通过Ext.getCmp('‘)来获取,那么,原来唯一的页面Id现在就变的不唯一了,会出现事件调用混乱。

昨天曾想了几年解决办法。

方法1:获取页面路径+Id后缀,生成唯一ID.

  实践,此路不通。

  代码如下:var url = window.location.href;

  获取结果,获取的是ExtJs的框架页路径,而不是当前面路径。

方法2:页面加载时,自动生成类Guid的Id+Id后缀,生成唯一ID。

  未作实践,理论上是可行的。

方法3:使用Js后缀传参,如:LogisticsMgr/MatRequireView.aspx.js?MatType=111

  我们就获取这个111,然后再+各控件Id后缀,生成唯一ID.

方法实现:

Ext.namespace("JsHelper");
//获得js文件后面的参数 如test.js?user=wuf created by wufei 2013-10-25
JsHelper.GetJsParamValue = function(param) {

    var rName = new RegExp("(\\?(.*))?$")
    var jss = document.getElementsByTagName('script');
    for (var i = 0; i < jss.length; i++) {
        var j = jss[i];
        if (j.src && j.src.match(rName)) {
            var oo = j.src.match(rName)[2];
            if (oo && (t = oo.match(/([^&=]+)=([^=&]+)/g))) {
                for (var l = 0; l < t.length; l++) {
                    r = t[l];
                    var tt = r.match(/([^&=]+)=([^=&]+)/);
                    if (tt && tt[1] == param) return tt[2];
                }
            }
        }
    }
    return '';
}

方法调用:var idPre = JsHelper.GetJsParamValue("MatType"); 

至此问题解决,声明ID和获取ID是都加上这个变量就可以了。

 

备注:此方案无效,因为Js只加载一次,所以后打开的页面获取的参数不正确。

希望高人指点解决方案。

 

posted @ 2013-10-25 09:40  黑 瞳  阅读(1176)  评论(8编辑  收藏  举报